2011-12-20 16 views
0

私はHibernateに問題があります。Thomasのおかげで、問題が判読しやすくなりました。要するにHibernate:Many To Many属性との関係:アノテーションを使用した正しい設​​定

関係が属性を持っており、私たちは、カスケードで、保存、削除、更新時に必要なHibernateで多対多の関連付けを設定するにはどのように?大で

:3つのテーブルがここにあります

   User  Profile 
       M______N 
        | 
        attribute 

"User", "Profile" and "User_Profile". 

今USER_PROFILEは明らかに1つの関係の属性(と持って想像

は、次のデータベースを想像してみてキー)。

[OK]を、今、これは次のようでHibernateに翻訳されます。ユーザーはプロフィール子供がそれらのすべてを保存している独立した場合、

User: 
// The relation is Many to Many, but considering that it has an attribute, this is OneToMany with the ManyMany RelationShip 
@OneToMany(mappedBy="user", targetEntity=UserProfile.class)  
@Cascade({CascadeType.SAVE_UPDATE, CascadeType.DELETE}) 
@LazyCollection(LazyCollectionOption.TRUE) 
private Set<UserProfile> userProfile = new HashSet<UserProfile>(); 


UserProfile: 
@Id  
@ManyToOne(targetEntity=User.class,fetch=FetchType.LAZY) 
@Cascade({CascadeType.LOCK}) 
@JoinColumns({ @JoinColumn(name="...", referencedColumnName="...") }) 
private User user; 

@Id  
@ManyToOne(targetEntity=Profile.class,fetch=FetchType.LAZY)  
@Cascade({CascadeType.LOCK}) 
@JoinColumns({ @JoinColumn(name="...", referencedColumnName="...") }) 
private Profile profile; 

だから、私は、設定が正しいと思うし、保存します。私は更新にしようとすると問題があるユーザー:

getHibernateTemplate().getSessionFactory().getCurrentSession().clear(); 
getHibernateTemplate().saveOrUpdate(user); 
getHibernateTemplate().getSessionFactory().getCurrentSession().flush(); 

Hibernateはプロフィール子供の空のセットがある場合、プロファイルの関係を削除するドント。プロファイルのみを追加する(古いものを上書きする)...まれです...問題は何ですか?

は何も削除されませんます理由です、あなたが実際に行うすべての関係を削除しているので、カスケードへの DELETEをtheresの事前

答えて

0

でいただきありがとうございます。

HibernateカスケードタイプDELETE_ORPHAN@Cascadeアノテーションを使用)を追加して、もはや参照されていないエンティティをHibernateで削除するようにしてください。

さらに、Miniエンティティのみを削除しません。関係がない場合、つまりMiniのセットが空の場合、通常、空のコレクションを表すSuperMiniエンティティを保持することは意味がありません(まれに、意味があるかもしれません。ない)。

編集DELETE_ORPHANであなたが設定を再利用する必要があることを

注、そうでない場合は、すべての関係を削除し、再挿入される可能性があります。

基本的に、Hibernateはセットが変更されたことを確認し、「古い」セットの削除と「新しい」セットの再挿入を発行します。これは必要になる可能性がありますが、更新が必要な場合、つまり唯一もう設定されていないエンティティを削除するには、次の手順を実行する必要があります

  1. 明確なセット
  2. は「新しい」addAll(...)
を使用して再利用し、今クリアセットに設定を追加します

これにより、孤児の更新(および孤児の削除)のみがトリガーされます。

+0

まず、あなたの答えに感謝します。オブジェクトSuperにMiniのセットがあり、スーパーエンティティのコレクションを空のセットで更新する場合は、HibernateがSuperMiniエンティティの削除フォームを起動する必要があります。 – ganzux

+0

実際、これは1M関係ではなく、M-N関係であることに注意してください。私が必要とするのは、ミニエンティティではなく、スーパーエンティティとミニエンティティの関係を削除することだけです。 – ganzux

+0

@ganzux私が言ったように、 'Super'の' superMini'リレーションに 'DELETE_ORPHAN'カスケード型が必要です。しかし、心に留めておくべきことが1つあります。セットを再利用する必要があります。私はそれに応じて私の答えを更新します。 – Thomas

関連する問題