@OneToOne
親エンティティと子エンティティの間に双方向の関係があります。
親には、これがあります (はい、子は関係の所有側です):
@OneToOne(mappedBy = "parent", fetch = FetchType.EAGER, optional = true, cascade = { CascadeType.ALL })
private Child child;
彼の主キーは (残念ながら) データベースによって生成されます。
@Column(name = "id", updatable = false)
@GeneratedValue(GenerationType.IDENTITY)
@Id
private long id;
子供には、これがあります:
// note: insertable = false, updatable = false
@JoinColumn(name = "parentId", referencedColumnName = "id", insertable = false, updatable = false)
@OneToOne(optional = false, fetch = FetchType.EAGER, cascade = { CascadeType.REFRESH })
private Parent parent;
@Column(name = "parentId", updatable = false)
@Id
private long parentId;
通常@PrimaryKeyJoinColumn
、これら 2 つのマッピングの代わりにアノテーションを使用しますが、いくつかの JPA プロバイダーにはこの領域にバグがあります。
ある時点で、新しい親インスタンスでいくつかの作業を行います。その仕事の一環として、私はこれを行います:
this.child = new Child(this);
...そしてChild(Parent)
コンストラクター内でこれを行います:
this.parent = parent; // now the bidirectionality is complete
if (parent != null) {
this.parentId = parent.getId(); // suspect; will be 0L
}
これまでのところ、相互に関係を持ち、適切に初期化された aParent
と aで構成されるオブジェクト グラフがあります。どちらのオブジェクトも管理対象外のエンティティです。Child
@OneToOne
次にpersist()
、親に試します:
this.em.persist(parent);
...Informix データベースで外部キー違反が発生します。一方、H2 データベースはこれを問題なく処理します。
それは起こっているべきことですか?私は何か間違ったことをしていますか?