私は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の事前
まず、あなたの答えに感謝します。オブジェクトSuperにMiniのセットがあり、スーパーエンティティのコレクションを空のセットで更新する場合は、HibernateがSuperMiniエンティティの削除フォームを起動する必要があります。 – ganzux
実際、これは1M関係ではなく、M-N関係であることに注意してください。私が必要とするのは、ミニエンティティではなく、スーパーエンティティとミニエンティティの関係を削除することだけです。 – ganzux
@ganzux私が言ったように、 'Super'の' superMini'リレーションに 'DELETE_ORPHAN'カスケード型が必要です。しかし、心に留めておくべきことが1つあります。セットを再利用する必要があります。私はそれに応じて私の答えを更新します。 – Thomas