大規模なJPAアノテート・エンティティを介してカスケード作成とマージを行う必要があるWebSphere 8.5.5(OpenJPA 2.2.3)のプロジェクトで作業しています。モデル。 grand-parents上でEntityManager.merge()を呼び出すか、トランザクションのコミット時にトリガーされたフラッシュによってgrand-childrenをマージする際には、非常に具体的な問題があります。ここでは詳細は以下のとおりです。エンティティのマッピングのコンパウンドEmbeddedId(別のEmbeddedIdを含むEmbeddedId)を使用してJPAエンティティを挿入する
関連部分:
- エンティティAはEntityBがEntityC にoneToMany
- EntityCがEntityD
すべてが双方向マッピングを持っています。エンティティAとBには、単一列の主キーがあります。エンティティCには、エンティティBの主キーに対する外部キーを含む複合主キーがあります。エンティティDには、エンティティCの複合キーを含む複合キーがあります。以下のマッピングを参照してください。
あなたはインクルードが正しく持続カスケードうとモデル(接続されているすべての子供たちと一緒に)エンティティAのEntityManager.persist()を呼び出すことができますどのような作品
@Entity
@Table(name="TableA")
public class EntityA extends BaseEntity {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="TABLE_A_ID_GEN")
@SequenceGenerator(name="TABLE_A_ID_GEN", sequenceName="TABLE_A_ID", allocationSize=1)
@Column(name="TABLE_A_ID")
private Integer id;
@OneToMany(fetch=FetchType.LAZY, mappedBy="entityA", cascade=CascadeType.ALL)
private List<EntityB> entityBList;
...
}
@Entity
@Table(name="TableB")
public class EntityB extends BaseEntity {
@Id
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="TABLE_B_ID_GEN")
@SequenceGenerator(name="TABLE_B_ID_GEN", sequenceName="TABLE_B_ID", allocationSize=1)
@Column(name="TABLE_B_ID")
private Integer id;
@ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.ALL)
@JoinColumn(name="TABLE_A_ID")
private EntityA entityA;
@OneToMany(fetch=FetchType.LAZY, mappedBy="entityB", cascade=CascadeType.ALL)
private List<EntityC> entityCList;
...
}
@Entity
@Table(name="TableC")
public class EntityC extends BaseEntity {
@EmbeddedId
private EntityC_PK id = new EntityC_PK();
@MapsId("entityB_Id")
@ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.ALL)
@JoinColumn(name="TABLE_B_ID")
private EntityB entityB;
@OneToMany(fetch=FetchType.LAZY, mappedBy="entityC", cascade=CascadeType.ALL)
private List<EntityD> entityDList;
...
}
@Embeddable
public class EntityC_PK implements BaseComponent {
@Column(name="TABLE_B_ID", nullable = false, updatable = false)
private Integer entityB_Id;
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="TABLE_C_ID_GEN")
@SequenceGenerator(name="TABLE_C_ID_GEN", sequenceName="TABLE_C_ID", allocationSize=1)
@Column(name="TABLE_C_ID")
private Integer entityC_Id;
...
}
@Entity
@Table(name="TABLE_D")
public class EntityD extends BaseEntity {
@EmbeddedId
private EntityD_PK id = new EntityD_PK();
@MapsId("entityC_Id")
@JoinColumns({
@JoinColumn(name = "TABLE_B_ID"),
@JoinColumn(name = "TABLE_C_ID")})
@ManyToOne(fetch=FetchType.LAZY, cascade=CascadeType.ALL)
private EntityC entityC;
...
}
@Embeddable
public class EntityD_PK implements BaseComponent {
@Embedded
private EntityC_PK entityC_Id;
@GeneratedValue(strategy=GenerationType.SEQUENCE, generator="TABLE_D_ID_GEN")
@SequenceGenerator(name="TABLE_D_ID_GEN", sequenceName="TABLE_D_ID", allocationSize=1)
@Column(name="TABLE_D_ID")
private Integer entity_id;
...
}
。あなたはEntityManager.persist(エンティティA)のエンティティAをインスタンス化して呼び出す場合
とTHENなどの子供、孫を、追加するときEntityManager.merge(エンティティA)(または許可:
何をして動作しませんトランザクションをコミットする際の暗黙的なマージ)、正しい順序でINSERTステートメントを実行することができません。物事をより混乱させるために、INSERTの順序は単体テストの繰り返し実行全体で一貫していません。マージ時に
我々は正しい挿入順序を強制(および更新/削除)するJPA注釈を修正方法:これは、エンティティC.
前に質問をエンティティDを挿入しようとすることで失敗しましたか?
EDIT 1: データベースが制約との外部キーの関係を強制するため、挿入/削除の順序が重要です。
ここに私の答えを見てください:http://stackoverflow.com/questions/39024310/openjpa-nested-onetomany-relationships-merge-issue/39025865#39025865 –