シーケンス番号を持つ混血代理キー:JPA、外部キーと私は2つのテーブルを持っている
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);
私はNULLを述べる例外を取得持続することはできません列SECTION_NUMに許可されています。 私はOpenEJB(ユニットテストのために舞台裏でOpenJPAを使用しています)を使用しています.OpenJPAコードをステップ実行するとDocumentオブジェクトが正常に存続することがわかりましたが、Sectionオブジェクトになると反映され、すべてのフィールドがnullになるため、以前に保持されたDocumentオブジェクトにリンクする前にsectionNum値を失います。
残念ながら、DBスキーマを変更することはできません。これは従来のシステムです。 誰かが似たようなことをしていて、それが機能していますか?
私の場合、@MapsIdが役に立つかもしれないと思いますか? https://stackoverflow.com/questions/46159867/オリジナルポスターの主な違いは、ManyToOneの代わりにOneToOneを使用することです。 – gouessej