JPA 2 with Hibernateでオブジェクトの永続性の順序を強制する方法はありますか?JPA 2でHibernateを強制的に推移させる永続性の順序?
私は3つのクラス:Parent
,Child
およびDesk
があります。 Parent
はChild
とDesk
のコレクションを所有し、@OneToMany
を所有します。 Child
は、1つのDesk
を持つことができます。さらに、Parent
は両方のコレクションに推移持続性を定義しますが、そのDesk
に推移持続性をChild
定義していません:
class Parent {
@OneToMany(cascade=CascadeType.ALL) Collection<Child> children;
@OneToMany(cascade=CascadeType.ALL) Collection<Desk> desks;
...
}
class Child {
@OneToOne(cascade={}) Desk desk;
@ManyToOne Parent parent;
}
class Desk {
@ManyToOne Parent parent;
}
理想的には、私は同じ時間にデスクと子を作成し、関係を持続したいと思います:
Parent parent = em.find(...);
Child child = new Child();
Desk desk = new Desk();
// add both desk and child to parent collections here
// set Parent attribute on both desk and child
Iは、トランザクションに上記のコードを実行Parent
から新しいChild
にカスケードを休止し、新しいChild
オブジェクトを永続化しようとします。残念ながら、Parent
からDesk
までのカスケードは、新しいDesk
オブジェクトがまだ永続化されていないため、「オブジェクトは未保存の一時的インスタンスを参照しています」というエラーが発生します。
私はEntityManagerのフラッシュ()操作(em.flush()
)の問題を修正することができます知っている - Child
にDesk
を取り付け、その後、em.flush()
、Parent
の両方を添付し、Desk
を作成し、Child
を作成するが、私はスーパーではありませんよ私のコードをem.flush()
で埋めて、新しい永続オブジェクトの複雑なグラフを保存してください。 JPA 2やHibernateに、新しいChild
の代わりに常に新しいDesk
を持続させるべきであることを通知する方法はありますか?
なぜ "OneToOne"カスケードタイプが空ですか?それは少なくとも "PERSIST"であってはなりませんか?また、ParenからChildへの休止状態のカスケードがどのように分かっていますか?たぶんDeskは、Childからではなく、Parentからカスケード接続しようとしているため失敗します。 – edutesoy
'Desk'オブジェクトの存続期間は、' Parent'オブジェクトの存続期間によって決まりますが、 'Child'オブジェクトではないので、' Parent.desks'には 'CascadeType.ALL'があり、' Child.desk'にはカスケード。 'Parent'から' Desk'オブジェクトのコレクションまで、 'Parent'から' Child'オブジェクトのコレクションまでのカスケードを確認するユニットテストがあります。 – BobG