与自动增量的主/细节关系。有可能立刻坚持下去吗?

时间:2011-03-17 11:22:22

标签: java mysql hibernate

我有这种情况:

tbl_master(
  master_field_pk int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`master_field_pk`)
)

tbl_detail(
  `detail_field_pk` int(11) NOT NULL AUTO_INCREMENT,
  `master_field_pk` int(11) DEFAULT NULL,
  CONSTRAINT `child_fk1` FOREIGN KEY (`master_field_pk`) REFERENCES `tbl_master` (`master_field_pk`) ON DELETE NO ACTION ON UPDATE NO ACTION,
  PRIMARY KEY (`master_field_pk`)
)

这是我的master的hibernate类:

@Entity
@Table(name = "tbl_master")
@Name("TblMaster")
public class TblMaster implements Serializable{
  @Id
  @Column(name = "master_field_pk")
  @GeneratedValue(strategy = GenerationType.AUTO)
  private Integer MasterFieldPk;

  @Cascade({CascadeType.ALL,CascadeType.DELETE_ORPHAN})
  @OneToMany(mappedBy="tblMaster")
  @JoinColumn(name="master_field_pk", insertable=true, updatable=true, referencedColumnName="master_field_pk")
  private Set<TblDetail> tblDetails;

  @Transient
  private List<TblDetail> tblDetailsList;  

  // any other things
}

这个是详细信息:

@Entity
@Table(name="tbl_detail")
@Name("TblDetail")
public class TblDetail implements Serializable{
  @Id
  @GeneratedValue(strategy=GenerationType.AUTO)
  @Column(name="detail_field_pk")
  private Integer detailFieldPk;

  @Column(name="master_field_pk")
  private Integer MasterFieldPk;

  @ManyToOne(fetch=FetchType.LAZY)
  @JoinColumn(name="master_field_pk", insertable = false, updatable = false, referencedColumnName = "master_field_pk")
  private TblMaster tblMaster;

  // any other things
}

要插入,我使用这段代码(或多或少):

TblDetail detail_1 = ...
detail_1.setTblMaster(tblMaster);
// and so on ..

Set<TblDetails> set = ...
set.add(detail_1);
// and so on...

tblMaster.setTblDetails(set);
em.persist(tblMaster);
em.flush();

完美插入所有记录(主记录和详细记录)。但是,master_field_pk中的tbl_detail - 外键 - 仍为空。有可能避免这种行为吗?感谢

2 个答案:

答案 0 :(得分:2)

没有。你必须先坚持主人。详细信息行需要知道主ID的链接。

这可以完成,但仅限于应用程序分配密钥时,例如应用程序分配的GUID密钥或某种密钥服务器。

答案 1 :(得分:1)

CascadeType.ALL应该为你做的伎俩。它一直对我有用。

我认为您的问题在于@GeneratedValue属性策略。您应该使用GenerationType.IDENTITY代替GenerationType.AUTO