2011-09-09 18 views
2

JPA 2 with Hibernateでオブジェクトの永続性の順序を強制する方法はありますか?JPA 2でHibernateを強制的に推移させる永続性の順序?

私は3つのクラス:Parent,ChildおよびDeskがあります。 ParentChildDeskのコレクションを所有し、@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())の問題を修正することができます知っている - ChildDeskを取り付け、その後、em.flush()Parentの両方を添付し、Deskを作成し、Childを作成するが、私はスーパーではありませんよ私のコードをem.flush()で埋めて、新しい永続オブジェクトの複雑なグラフを保存してください。 JPA 2やHibernateに、新しいChildの代わりに常に新しいDeskを持続させるべきであることを通知する方法はありますか?

+0

なぜ "OneToOne"カスケードタイプが空ですか?それは少なくとも "PERSIST"であってはなりませんか?また、ParenからChildへの休止状態のカスケードがどのように分かっていますか?たぶんDeskは、Childからではなく、Parentからカスケード接続しようとしているため失敗します。 – edutesoy

+0

'Desk'オブジェクトの存続期間は、' Parent'オブジェクトの存続期間によって決まりますが、 'Child'オブジェクトではないので、' Parent.desks'には 'CascadeType.ALL'があり、' Child.desk'にはカスケード。 'Parent'から' Desk'オブジェクトのコレクションまで、 'Parent'から' Child'オブジェクトのコレクションまでのカスケードを確認するユニットテストがあります。 – BobG

答えて

1

あなたの説明を見ると、私は永続システムがこの順で最初に固執しようとしていることを考える:

  • まずParent.children [i]は
  • 各子供[I]への過渡のポインタを持っています机。システムをCascade.Persistとして設定していないため、システムはそれを維持できません。

次に、Deskを永続化すると失敗し、パスParent.desks [i](カスケードとして設定されています)に失敗したと思われますが、このパスから失敗していない可能性があります。

+0

Child.desk *にCascadeType.PERSISTを追加すると、目的の動作が実現します。私は必ずしもそのオプションに熱心ではありませんが、em.flush()でコードを捨てるよりも優れています。 – BobG

関連する問題