次のことを考慮してください。
User.java
class User{
...
private Set<Community> communities = new HashSet<Community>();
...
}
Community.java
class Community{
...
private Set<User> users = new HashSet<User>();
...
}
User.hbm.xml
<set name="communities" cascade="save-update" lazy="false" table="tbl_user_community">
<key column="user_id" />
<many-to-many class="Community" column="community_id"/>
</set>
Community.hbm.xml
<set name="users" lazy="false" cascade="save-update" table="tbl_user_community" inverse="true">
<key column="community_id" />
<many-to-many class="User" column="user_id"/>
</set>
両方にmany-to-many
関係があります。
ユーザーにコミュニティを追加するためのコード:
HibernateTemplate template = null;
SessionFactory sessionFactory = HibernateUtil.getSessionFactory();
template = new HibernateTemplate(sessionFactory);
User user = template.get(User.class, "100");
Community community = template.get(Community.class,1);
user.getCommunities().add(community);
template.saveOrUpdate(user);
シナリオ:
- community1はuser1に割り当てられます(データベースに挿入されます)
- community2はuser1に割り当てられます(データベースに挿入されます)
- community1はuser2に割り当てられています(データベースに挿入されています)
- community2はuser2に割り当てられています(データベースに挿入されていない、throws
NonUniqueObjectException
)- 私が
template.merge(user)
代わりに使用する場合template.saveOrUpdate(user)
..それは動作します..なぜ???