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

时间:2014-08-26 10:36:28

标签: java hibernate netbeans orm

我有两张桌子(比如表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;
.
.
.

现在我的问题是:

  1. 保存数据的正确方法是什么,我应该为表B实体创建对象并将其设置在表A实体中,然后保存表A?
  2. 我使用netbeans IDE功能生成实体bean。它有任何已知的缺点吗?如果有,是什么?

2 个答案:

答案 0 :(得分:1)

您有双向关联,因此您需要在Table B实体类中设置Table A属性,反之亦然。由于您尚未声明级联,因此需要先保存Table A实体,然后再保存Table B实体。

或者,如果保存Table B然后保存Table A实体类,则hibernate会生成额外的SQL update命令以维持关系。

但是如果你希望在保存Table B实体时hibernate保存Table A实体,那么你需要添加Cascade属性:

@OneToMany(mappedBy = "wtId", cascade=CascadeType.ALL)

如果您使用Netbeans生成实体类,我认为您不会有任何缺点,它可以节省您编写实体的时间。但是如果你想学习,那么编写没有Netbeans的实体是好的。

答案 1 :(得分:0)

要实现此目的,您可以使用两种类型的技术XML映射或注释 在这两种技术中,共同点是使用     级联=“保存更新” 会发生什么是在一个表getter中设置一个属性,当插入一个关系表时它会自动插入到多个关系中