我試圖在兩個實體之間創建一個雙向一對多關聯,其中多邊有一個複合關鍵字。而許多方面的關鍵之一就是來自一方。另外,我需要協會的擁有者多方。以下是顯示我的代碼外觀的示例代碼。休眠雙向一對多複合密鑰
沒有Jointable
父類是一側。我需要這個協會的這邊老闆。
public class parent{
@Id
@Column(name = "NAME")
private String name;
@OneToMany(fetch=FetchType.LAZY)
@JoinColumns({
@JoinColumn(name="NAME", nullable = false),
@JoinColumn(name="PARENT", nullable = false)})
private Set<Child> childs;
}
子類是多方面。它的主鍵是「名字」和「父母」。 「父母」來自協會。
public class child{
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name="parent", [email protected](name="PARENT", nullable=false)),
@AttributeOverride(name="name", [email protected](name="NAME", nullable=false))})
private ChildId id;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumns({
@JoinColumn(name="PARENT", nullable = false, updatable = false, insertable = false),
@JoinColumn(name="NAME", nullable = false, updatable = false, insertable = false)})
private Parent parent;
}
ChildId是Embedded id。
@Embeddable
public class childId{
@Column(name = "PARENT")
private String parent;
@Column(name = "NAME")
private String name;
}
隨着Jointable
父類
public class parent{
@Id
@Column(name = "NAME")
private String name;
@OneToMany(fetch = FetchType.LAZY)
@JoinTable(name="PARENTCHILD",
joinColumns= {@JoinColumn(name="PNAME", referencedColumnName = "NAME", nullable = false)},
inverseJoinColumns = {
@JoinColumn(name="CNAME", referencedColumnName = "NAME", nullable = false),
@JoinColumn(name="CPNAME", referencedColumnName = "PARENT", nullable = false)})
private Set<Child> childs;
}
子類
public class child{
@EmbeddedId
@AttributeOverrides({
@AttributeOverride(name="parent", [email protected](name="PARENT", nullable=false)),
@AttributeOverride(name="name", [email protected](name="NAME", nullable=false))})
private ChildId id;
@MapsId("parent")
@ManyToOne(fetch=FetchType.LAZY)
@JoinTable(name="PARENTCHILD",
inverseJoinColumns = {@JoinColumn(name="PNAME", referencedColumnName = "NAME", nullable = false)},
joinColumns = {
@JoinColumn(name="CNAME", referencedColumnName = "NAME", nullable = false),
@JoinColumn(name="CPNAME", referencedColumnName = "PARENT", nullable = false)})
private Parent parent;
}
問題1: 此代碼不能正常工作。如果「沒有連接」,它會給出以下例外。
Caused by: org.hibernate.AnnotationException: A Foreign key refering com.entity.Parent from com.entity.Child has the wrong number of column. should be 1
問題2: 而在「與jointable」的情況下,它提供例外如下:
SQLCODE=-530, SQLSTATE=-23503, SQLERRMC=PARENTCHILD.FK_PARENTCHILD_CHILD
你不需要有這個問題的複合鍵,作爲父母的名字將被Hibernate itself.To插入的外鍵兒童讓Parent作爲關係的所有者,請在child @ManyToOne中添加mappedBy = parent。這應該可以解決你所有的問題。 請驗證並接受我用下面的代碼片段給出的答案。 –
我給你的答案中的代碼,你不需要加入,只是嘗試我給的代碼。請參閱下面的答案,嘗試該代碼,讓我知道你面對什麼問題。 –
謝謝@BirajChoudhury。我知道這很多,父母將作爲外鍵在子表中。但是,假設孩子的獨特性與父母的名字一致。然後,假設孩子的主鍵爲EmbeddedId,你的代碼將和我的一樣。 – amir