エンティティ間に複雑な階層があります。エラーのため (以下を参照)、多くの場所に CASCADE.ALL または CASCADE.PERSIST を配置しました。上から下まで、注釈は問題ありません。しかし、下から上まで、それは私が望むものではありません。
オブジェクトが重複して保存される原因となります。
どうすればこの問題を解決できますか??
PS C と F の関係が必要な理由: F オブジェクトを取得する標準的な方法だからです。(現在、ユースケースの %90)
** Java コード -- A ツリーの作成 **
public A convertToA(final QueryAType aType, final A parent) {
final A a = new A();
if (parent != null) {
a.setVater(parent);
}
final List<A> children = new ArrayList<A>();
for (final QueryAType childPart : aType.getUnterbauteil()) {
children.add(convertToA(childPart, a));
}
final List<B> bList = new ArrayList<B>();
for (final QueryBType bType : aType.getBType()) {
bList.add(convertToB(bType, a));
}
a.setBList(bList);
a.setKinder(children);
return a;
}
public B convertToB(final QueryBType bType, final A a) {
final B b = new B();
b.setA(a);
final List<C> cList = new ArrayList<C>();
for (final QueryCType cType : bType.getCType()) {
cList.add(convertToC(cType, b));
}
b.setCList(cList);
return b;
}
public C convertToC(final QueryCType cType, final B b) {
final C c = new C();
c.setB(b);
final List<D> dList = new ArrayList<D>();
for (final QueryDType dType : cType.getDType()) {
dList.add(convertToD(dType, c));
}
c.setDList(dList);
return c;
}
public D convertToD(final QueryDType dType, final C c) {
final D d = new D();
d.setProbe(c);
final List<E> eList = new ArrayList<E>();
for (final QueryEType eType : dType.getEType()) {
eList.add(convertToE(eType, d, c));
}
d.setEList(eList);
return d;
}
public E convertToE(final QueryEType eType, final D d, final C c) {
final E e = new E();
e.setD(d);
final List<F> fList = new ArrayList<F>();
for (final QueryFType fType : eType.getFType()) {
fList.add(convertToF(fType, e, c));
}
e.setFList(fList);
c.setFList(fList);
return e;
}
public F convertToF(final QueryFType fType, final E e, final C c) {
final F f = new F();
f.setC(c);
f.setE(e);
final List<G> gList = new ArrayList<G>();
for (final QueryGType gType : fType.getGType()) {
gList.add(convertToG(gType, f));
}
f.setGList(gList);
return f;
}
public G convertToG(final QueryGType gType, final F f) {
final G g = new G();
g.setMethode(f);
return g;
}
カスケードなしのエラー:
org.apache.openjpa.persistence.InvalidStateException: フィールド "com.xxx.yyy.data.entity.Fe を介して永続性をカスケードしているときに、管理されていないライフサイクル状態で管理されていないオブジェクト "com.xxx.yyy.data.entity.E@18e0a217" が検出されました"フラッシュ中。ただし、このフィールドではカスケードの持続は許可されません。アンマネージド オブジェクトまたはアンマネージド オブジェクトへの永続的な関連付けを持つグラフをフラッシュすることはできません。推奨されるアクション: a) このフィールドの cascade 属性を CascadeType.PERSIST または CascadeType.ALL (JPA アノテーション) または「persist」または「all」 (JPA orm.xml) に設定する、b) cascade-persist をグローバルに有効にする、c) 手動でフラッシュする前に関連するフィールド値を保持します。d) 参照が別のコンテキストに属している場合は、StoreContext.setAllowReferenceToSiblingContext() を設定して参照を許可します。失敗したオブジェクト: com.xxx.yyy.data.entity。