簡體   English   中英

Hibernate自動在復合ID中填充外鍵

[英]Hibernate auto populate foreign key in composite id

我有兩個表(列):PARENT(P_ID_PK,AUTO_INCREMENT)和CHILD(P_ID_FK,C_NAME(PK = P_ID + C_NAME))

他們有一對多的關系。 當我保留父對象和子對象時,P_ID_PK具有自動遞增的值,但是P_ID_FK僅具有默認值(0)。 如何讓P_ID_FK具有與P_ID_PK相同的值? 這是我的代碼:

@Entity
@Tabler (name="PARENT")
public class Parent {
  @ID
  @Column (name = "P_ID_PK")
  @GeneratedValue(strategy=GenerationType.Identity)
  private Integer pIdPk;

  @OneToMany(mappedBy = "parent", cascade={CascadeType.ALL})
  @JoinColumn (name = "P_ID_PK")
  private List<Child> children;
  //...getters setters, constructors 
 }

@Embeddable
public class ChildId implements Serializable {
  private Integer pIdFk;
  private String cName;

  @Column(name="P_ID_FK")
  public Integer getPIdFk(){
  return this.pIdFk;}

  @Column(name="C_NAME")
  public String getCName(){
  return this.cName;}
  //... setters, @Override hashCode(),equals()
}

@Entity
@Table(name="CHILD")
public class Child {
  @EmbeddedId
  @AttributeOverrides({
     @AttributeOverride (name="pIdFk", column=@Column(name="P_ID_FK")),
     @AttributeOverride (name="cName", column=@Column(name="C_NAME"))})
 private ChildId childId;

@ManyToOne
@JoinColumn (name="P_ID_FK", referencedColumnName="P_ID_PK")
private Parent parent;
 //... Constructors, getters and setters 
}

test:
{
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

Parent p = new Parent();
List<Child> cs = new Arraylist<Child>();
ChildId cId = new ChildId();
cId.setCName("xxx");
Child C = new Child();
c.setChildId(cId);
c.setParent(p);
cs.add(c);
p.setChildren(cs);

session.save(p);
System.out.println("pIdPk= "+p.getPIdPk());
System.out.println("pIdFk= "+p.getChidren().get(0).getPIdFk);
....
}

Output:
pIdPk= Auto_incremented values (works well)
pIdFk= 0 (Problem: how to have the same value as pIdPk?)

經過多次嘗試,似乎不可能自動填充作為組合鍵一部分的外鍵。 我發現了兩種解決方法:1)首先保持父級,然后讀取pk值,設置fk值並保持子級; 2)使用ElementCollection。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM