Java 具有自动增量的主/明细关系。有没有可能一次坚持下去?

Java 具有自动增量的主/明细关系。有没有可能一次坚持下去?,java,mysql,hibernate,Java,Mysql,Hibernate,我有这样一个场景: tbl_master( master_field_pk int(11) NOT NULL AUTO_INCREMENT, PRIMARY KEY (`master_field_pk`) ) 及 这是我的master hibernate类: @Entity @Table(name = "tbl_master") @Name("TblMaster") public class TblMaster implements Serializable{ @Id @Col

我有这样一个场景:

tbl_master(
  master_field_pk int(11) NOT NULL AUTO_INCREMENT,
  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
}
要插入,我使用以下代码块(或多或少):

TBL详细信息\u 1=。。。
详图1.设置总机(总机);
//等等。。
集合=。。。
增加(详图1);
//等等。。。
TBL主设置TBL详细信息(设置);
em.persist(tblMaster);
em.flush();

所有记录(主记录和详细记录)都被完美地插入。但是,
tbl\u detail
中的
master\u字段\u pk
外键仍然为空。有可能避免这种行为吗?谢谢

不。你必须先坚持大师。详细信息行需要知道要链接的主ID


这只能在应用程序分配密钥(例如,应用程序分配的GUID密钥或某种密钥服务器)时完成

CascadeType。所有的
都应该能帮到你。它一直对我有效


我认为你的问题在于你的
@GeneratedValue
属性策略。你应该使用
GenerationType.IDENTITY
而不是
GenerationType.AUTO

这是我想到的第一件事。然而,我想确保所有的“插入”都作为一个原子事务发生。这样,如果有必要,我可以全部回滚它们。实际上,使用指定的主键解决了这个问题。但是,我的DBA不想这样做:(您仍然可以在单个事务中执行这些操作,您只需显式启动事务。很抱歉,它不起作用。我正在开发的一个应用程序中也有类似的场景。如果我让它起作用,我会让您知道。只是为了添加一些反馈,这不起作用,您必须按照Ben的回答中所述,首先坚持使用master。
@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();