私は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);
永続化すると、列 SECTION_NUM に NULL は許可されていないという例外が発生します。私は OpenEJB (単体テストのために舞台裏で OpenJPA に依存している) を使用しており、OpenJPA コードをステップ実行すると、Document オブジェクトが正常に永続化されることがわかりましたが、Section オブジェクトになると、新しいインスタンスが反射的に作成され、すべてが設定されます。 fields が null に設定されるため、sectionNum の値が失われ、Document オブジェクトにリンクする前に保持されます。
残念ながら、レガシー システムであるため、DB スキーマを変更することはできません。誰かが似たようなことをして、それを機能させましたか?