我有兩個表混合代理鍵:JPA,與外鍵和序列號
DOCUMENT
--------
DOC_ID (PK)
.
.
.
SECTION
-------
DOC_ID (FK, PK)
SECTION_NUM (PK)
.
.
.
數據庫中的條目可能是這樣的:
文件:
DOC_ID | . . .
--------------
1 | . . .
2 | . . .
部分:
DOC_ID | SECTION_NUM | . . .
---------------------------
1 | 1 | . . .
1 | 2 | . . .
1 | 3 | . . .
2 | 1 | . . .
Document
在DOC_ID上有生成的Id,而Section
在DOC_ID和SECTION_NUM上有複合主鍵。
SECTION_NUM是本地(應用程序)生成的序列號,從每個文檔開始新鮮。
我的實體類,如下所示:
@Entity
@Table(name = "DOCUMENT")
public class Document implements java.io.Serializable {
@Id
@Column(name = "DOC_ID", nullable = false)
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "DocIdSeq")
@SequenceGenerator(name = "DocIdSeq", sequenceName = "DOC_ID_SEQ", allocationSize = 1)
private Long docId;
}
@Entity
@Table(name = "SECTION")
@IdClass(SectionId.class)
public class Section implements java.io.Serializable {
@Id
@Column(name = "DOC_ID", nullable = false)
private Long docId;
@Id
@Column(name = "SECTION_NUM", nullable = false)
private Integer sectionNum;
@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "DOC_ID")
private Document document;
}
public class SectionId implements java.io.Serializable {
private Long docId;
private Integer sectionNum;
}
當插入一個新的文檔和相關部門,我做到以下幾點:
Document doc = new Document();
Section section = new Section();
section.setDocument(doc);
section.setSectionNum(1);
entityManager.persist(doc);
當堅持我得到一個異常,說明空不允許列SECTION_NUM。 我使用OpenEJB(依靠OpenJPA在幕後進行單元測試),並在逐步完成OpenJPA代碼時發現它成功保留了Document對象,但是當涉及到Section對象時,它會反射地創建一個新實例並設置所有字段都爲空,因此在將它鏈接到Document對象之前保持較早的狀態之前丟失了sectionNum值。
不幸的是我無法更改數據庫模式,因爲它是一個遺留系統。 有沒有人做過類似的事情,並得到它的工作?
你認爲@MapsId可能對我有用嗎? https://stackoverflow.com/questions/46159867/與原來的海報的主要區別是使用OneToOne而不是ManyToOne。 – gouessej 2017-09-14 08:38:10