我很難試圖獲得單向的一對一關係來使用JPA(Provider:Hibernate)。在我看來,這應該不是太麻煩,但顯然JPA /休眠不同意;-)JPA /休眠與共享主鍵的單向一對一映射
問題是,我必須映射一個遺留架構,我不能改變,這個架構使用共享主兩個實體之間的密鑰同時也是一個實體的外鍵。
我創建了一個簡單測試用例:
DB看起來如下:
CREATE TABLE PARENT (PARENT_ID Number primary key, Message varchar2(50));
CREATE TABLE CHILD (CHILD_ID Number primary key, Message varchar2(50),
CONSTRAINT FK_PARENT_ID FOREIGN KEY (CHILD_ID)REFERENCES PARENT (PARENT_ID));
CREATE SEQUENCE SEQ_PK_PARENT START WITH 1 INCREMENT BY 1 ORDER;
父(=之一到一擁有側)看起來如下:
@Entity
@Table(name = "PARENT")
public class Parent implements java.io.Serializable {
private Long parentId;
private String message;
private Child child;
@Id
@Column(name = "PARENT_ID", unique = true, nullable = false, precision = 22, scale = 0)
@SequenceGenerator(name="pk_sequence", sequenceName="SEQ_PK_PARENT")
@GeneratedValue(generator="pk_sequence", strategy=GenerationType.SEQUENCE)
public Long getParentId() {
return this.parentId;
}
public void setParentId(Long parentId) {
this.parentId = parentId;
}
@Column(name = "MESSAGE", length = 50)
public String getMessage() {
return this.message;
}
public void setMessage(String message) {
this.message = message;
}
@OneToOne (cascade = CascadeType.ALL)
@PrimaryKeyJoinColumn(name="PARENT_ID", referencedColumnName="CHILD_ID")
public Child getTestOneToOneChild() {
return this.child;
}
public void setTestOneToOneChild(Child child) {
this.child = child;
}
}
小孩:
@Entity
@Table(name = "TEST_ONE_TO_ONE_CHILD", schema = "EXTUSER")
public class Child implements java.io.Serializable {
private static final long serialVersionUID = 1L;
private Long childId;
private String message;
public Child() {
}
public Child(String message) {
this.message = message;
}
@Id
@Column(name = "CHILD_ID")
public Long getChildId() {
return this.childId;
}
public void setChildId(Long childId) {
this.childId = childId;
}
@Column(name = "MESSAGE", length = 50)
public String getMessage() {
return this.message;
}
public void setMessage(String message) {
this.message = message;
}
}
我完全看到JPA不知道如何爲孩子分配ID的問題。不過我也嘗試過使用Hibernates的「外部」鍵生成器也沒有成功,因爲那個人需要有一個不希望的從父母的父引用。 這個問題對我來說並不罕見,所以我在這裏錯過了什麼?有沒有解決方案?如果純粹的JPA沒有提供解決方案,我也可以使用hibernate擴展。
我對正確行爲的期望是: 如果我試圖堅持附有孩子的父母:從序列
- 獲取ID,將其設置在父
- 堅持父
- 集父母的兒童ID
- 堅持孩子
如果我試圖堅持「獨立」孩子(例如entityManager.persist(aChild))我期望一個RuntimeException。
任何幫助,非常感謝!
我還沒有嘗試過,但它可能工作,因爲你把註釋放在getter上,它應該告訴Hibernate用setter填充你的POJO。您可以嘗試在setParentId()和setChild()方法中設置子標識(如果它還沒有)。 – 2011-01-21 08:08:22
不能,這是行不通的:IdentifierGenerationException:這個類的id必須在調用save之前手動賦值save() – Korgen 2011-01-21 08:30:33
您使用的是哪個版本的Hibernate? – axtavt 2011-01-21 13:22:33