使用休眠为相互关联的表存储数据

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),实现对远程服务器的表进行操作,或者实现数据库数据的分布式存储

使用MySQL联合存储引擎(FEDERATED),实现对远程服务器的表进行操作,或者实现数据库数据的分布式存储

MYSQL-存储引擎

如何处理数据仓库中的图关系?