[英]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.