使用休眠为相互关联的表存储数据
Posted
技术标签:
【中文标题】使用休眠为相互关联的表存储数据【英文标题】:Storing data using hibernate for inter related tables 【发布时间】:2014-08-26 10:36:27 【问题描述】:我有两张桌子(比如桌子 A 和桌子 B)。表 B 具有表 A 主键的外键。我使用 netbeans IDE 生成了我的 java 实体,现在我有类似的东西:
对于表 A:
@Entity
@Table(name = "WORKFLOW_TRANSACTION")
public class WorkflowTransaction implements
@OneToMany(mappedBy = "wtId")
private Collection<WorkflowTask> workflowTaskCollection;
@Id
@Basic(optional = false)
@NotNull
@Column(name = "APP_ID")
private BigDecimal appId;
.
.
.
对于表 B:
@Entity
@Table(name = "WORKFLOW_TASK")
public class WorkflowTask implements Serializable
@JoinColumn(name = "WT_ID", referencedColumnName = "APP_ID")
@ManyToOne
private WorkflowTransaction wtId;
@Id
@Basic(optional = false)
@NotNull
@Column(name = "TASK_ID")
private BigDecimal taskId;
@Column(name = "STEP_NUM")
private BigInteger stepNum;
.
.
.
现在我的问题是:
-
保存数据的正确方法是什么,我应该为表B实体创建对象并将其设置在表A实体中然后保存表A吗?
我正在使用 netbeans IDE 功能生成实体 bean。它有什么已知的缺点吗?如果有,是什么?
【问题讨论】:
【参考方案1】:你有双向关联,所以你需要在Table A
实体类中设置Table B
属性,反之亦然。由于没有声明级联,所以需要先保存Table A
实体,再保存Table B
实体。
或者,如果您保存Table B
,然后保存Table A
实体类,hibernate 会生成额外的 SQL update
命令来维护关系。
但是如果你想让hibernate在保存Table B
实体的时候保存Table A
实体那么你需要添加Cascade属性:
@OneToMany(mappedBy = "wtId", cascade=CascadeType.ALL)
如果您使用 Netbeans 生成实体类,我认为您不会有任何缺点,它可以节省您编写实体的时间。但如果你想学习,那么不使用 Netbeans 编写实体也不错。
【讨论】:
感谢您的回复!另外,有什么更好的方法。我应该单独保存表 A 和表 B 还是一起保存?两种方式之间的性能差异? 如果您不使用我的回答中提到的cascade
,那么您需要注意保存这两个实体。但是先保存Table A
,然后使用session.save(Object)
保存Table B
。但是如果你使用 Cascade,那么当你保存 Table A
时,Hibernate 将负责保存 Table B
实体。这里没有性能问题。你是什么意思我分开和一起储蓄?【参考方案2】:
要实现这一点,您可以使用两种技术 XML 映射或注释 在这两种技术中,共同点是使用 级联=“保存更新” 发生的情况是,您在一个表 getter 中设置了一个属性,它会在插入一个关系表时自动插入到多个关系中
【讨论】:
以上是关于使用休眠为相互关联的表存储数据的主要内容,如果未能解决你的问题,请参考以下文章
使用MySQL联合存储引擎(FEDERATED),实现对远程服务器的表进行操作,或者实现数据库数据的分布式存储