で存続/マージ、私はBが同様にマージすることにしたい - ちょうどいつもので、私はBの操作を行うことはありません、操作A.上のBのオブジェクトAオブジェクトを介してアクセス可能ですが、可能であればその逆もできません。 AとBを共有し、同じ主キーフィールドは、つまり、Bの主キーフィールドには、私は最終的にINSERT
クエリが正しい順序になっているポイントにそれを持っている、しかし、Aの主キーに対する外部キーですそれはクエリパラメータにIDを結合いないので、主キーが設定されていないとして、しかし、それはInsertNullViolation
を投げています。誰かがBのような結合されたオブジェクトの主キーをバインドするためにEclipseLinkを取得する方法を知っていますか?EclipseLinkは私がAをマージするとき、私は2つのエンティティ、AとBを持って参加したオブジェクト
public class A {
...
@Id
@Column(name = "A_ID")
@SequenceGenerator(...)
@GeneratedValue(...)
public Long getA_ID();
@OneToOne(mappedBy = "a", targetEntity = B.class)
public B getB();
...
}
public class B {
...
@Id
public Long getA_ID();
@MapsId
@OneToOne(targetEntity = A.class)
@JoinColumn(name="A_ID")
public A getA();
...
}
上記のセットアップがBに主キーを設定していないので、InsertNullViolationは、このセットアップでも同じ問題を持っているB.
public class A {
...
@Id
@Column(name = "A_ID")
@SequenceGenerator(...)
@GeneratedValue(...)
public Long getA_ID();
@OneToOne(mappedBy = "a", targetEntity = B.class)
public B getB();
...
}
public class B {
...
@Id
@OneToOne(targetEntity = A.class)
@JoinColumn(name="A_ID")
public A getA();
...
}
に挿入しようとしてスローされます。例外は次のとおりです。
バインドラインの最後のnull
が、それは私がマージするためのやっているオブジェクトA を挿入したとき、それは以前にシーケンスから取得し、実際のIDでのEclipseLinkで記入する必要があることを
Internal Exception: java.sql.SQLIntegrityConstraintViolationException: ORA-01400: cannot insert NULL into ("SOME_USER"."B"."A_ID")
Error Code: 1400
Call: INSERT INTO B (SOME_FIELD1, SOME_FIELD2, ..., A_ID) VALUES (?, ?, ..., ?)
bind => [null, SOME_VALUE, ..., null]
Query: InsertObjectQuery([email protected])
本質的に次のようになります。
public void merge(A objectA, B objectB) {
objectA.setB(objectB);
entitymanager.merge(objectA);
}
エンティティの永続化に使用しているコードも表示できますか? – Chris