2011-02-10 8 views
1

PersonクラスとRoleクラスの間にOnetoMany関係があります。人は複数の役割を持つことができます。私は新しい人を作成するときに、ロール(既存のレコード)は人のIDで更新する必要があります。私はCascadeType Allで@OneToManyマッピングを使用していますが、RoleクラスはPerson IDで更新されていません。 Personを作成しているときに新しいロールを作成して関係として設定すると、正常に動作します。しかし、新しいPersonを作成してそれを既存のRoleに設定しようとすると、更新されません。OneToManyアップデートが子クラスで動作しない

+0

いくつかのサンプルコードが役立つことがあります。

は、ここでは、この更なる議論の素敵なブログの記事、です。 – axtavt

+0

[この問題](http://stackoverflow.com/questions/2441598/detached-entity-passed-to-persist-error-with-jpa-ejb-code/4905238#4905238)と非常によく似ています。 – zawhtut

答えて

0

これは、双方向リンクでは手動で行う必要があります。あなたのケースではhttp://docs.jboss.org/hibernate/core/3.6/reference/en-US/html_single/#tutorial-associations-usingbidir

:Hibernateのチュートリアルでは、良い例を提供しOneToMany側では、あなたのsetPersons(...)メソッドを保護しますが、このような公共addPerson(人物P)メソッドを定義:

public void addPerson(Person p) { 
    this.getPersons().add(p); 
    p.setRole(this); 
} 

ところで、人が複数の役割を持つことができ、複数の人に役割を割り当てることができれば、実際には多分ManyToMany関係が望ましいでしょう。だから、必要があると思います:

public void addPerson(Person p) { 
    this.getPersons().add(p); 
    p.getRoles().add(this); 
} 

そして、クラスPersonには:

public void addRole(Role r) { 
    this.getRoles().add(r); 
    r.getPersons().add(this); 
} 

EJB 2.xのコンテナ管理関係(CMR)とは対照的に、これは自動的に処理されていないので、これは、必要があります。 HibernateはPOJOのアプローチを使用します。 CMRの欠点は、オブジェクトを作成するためにコンテナが必要だが、POJOオブジェクトをどこにでも作成できることです。そして、それらを作成した場合、それらは単なる古くからのJavaオブジェクトです。 http://blog.xebia.com/2009/03/16/jpa-implementation-patterns-bidirectional-assocations/

+0

誰にでも下落した人に:これは公式文書からのものです。あなたはよりよい解決策を持っていますか? (注意:Hibernateはあなたのオブジェクトに対して* black magic *を実行しません。双方向リンクを自動化するために必要です)。 –

関連する問題