1

@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 データベースはこれを問題なく処理します。

それは起こっているべきことですか?私は何か間違ったことをしていますか?

4

1 に答える 1

0

参考になる質問がいくつかあります。元の投稿でそれらに答えてください:

Q1: H2 データベースに外部キーと主キーの制約がありますか (チェックしてください)?

Q2:NULLABLE国旗は?(両方のデータベース)

Q3: persist() を呼び出した瞬間に、子の parentId の ID をデバッグして確認します。

Q4:CascadeType.ALLを親から削除して、操作を手動で管理する (または永続化するだけ) ことは可能でしょうか?

質問の 1 つに答えることで、問題の解決策が得られることを願っています。

于 2013-09-21T22:02:55.777 に答える