多對多其實是個很複雜的關系,hibernate在進行處理的時候借助中間表或者中間類。中間表是在映射檔案的關聯标簽(比如集合标簽<set>)中由table屬性指定的由hibernate自動生成的表,它隻有兩個字段,分别由<key>和<many-to-many>标簽的table屬性指定,作為外鍵分别用來指向關聯雙方表的主鍵。中間類就是把我們的中間表抽象生成一個實體類,在映射的時候分别和兩個關聯類構成一對多的關系,即演變成兩個一對多來處理。
我習慣使用中間表的方式。
1.實體模型:
2.關系模型:
3.實體類:
Role.java
public class Role {
private Integer id;
private String name;
//一系列的setter.getter方法
@Override
public String toString() {
return "Role:" + name;
}
}
Player.java
public class Player {
private Set<Role> roles;
return "Player:" + name;
4.映射檔案:
Role.hbm.xml
<class name="com.sxt.hibernate.many2many.entity.Role" table="sxt_hibernate_role">
<id name="id" length="4">
<generator class="native"></generator>
</id>
<property name="name" length="10"></property>
</class>
Player.hbm.xml
<class name="com.sxt.hibernate.many2many.entity.Player" table="sxt_hibernate_player">
<!--table="sxt_hibernate_user_role"含義,用來指定中間表 -->
<set name="roles" table="sxt_hibernate_player_role" cascade="save-update">
<!--<key column="user_id">含義,指定中間表中用來指向本表的外鍵 -->
<key column="player_id"></key>
<!-- column含義,用來指定中間表中用來指向另一端表的外鍵 -->
<many-to-many class="com.sxt.hibernate.many2many.entity.Role" column="role_id"></many-to-many>
</set>
5.hibernate配置檔案:
參見上一篇。
6.測試方法:
public static void main(String[] args) {
Session session = HibernateUtils.getSession();
Transaction t = session.beginTransaction();
try {
/**
* 測試插入資料
*/
/* Role role1=new Role();
role1.setName("後衛");
Role role2=new Role();
role2.setName("前鋒");
Role role3=new Role();
role3.setName("中鋒");
Player player1=new Player();
player1.setName("姚明");
Set<Role> roles1=new HashSet<Role>();
roles1.add(role3);
player1.setRoles(roles1);
Player player2=new Player();
player2.setName("詹姆斯");
Set<Role> roles2=new HashSet<Role>();
roles2.add(role1);
roles2.add(role2);
roles2.add(role3);
player2.setRoles(roles2);
//能正确儲存.每儲存player後,都要級聯儲存它的role,并且級聯插入中間表記錄.
session.save(player1);
session.save(player2);*/
* 測試加載資料
Player player=(Player)session.load(Player.class, 1);
System.out.println(player);
for(Iterator<Role> iterator=player.getRoles().iterator();iterator.hasNext();){
System.out.println(iterator.next());
}
t.commit();
} catch (HibernateException e) {
e.printStackTrace();
t.rollback();
} finally {
HibernateUtils.closeSession(session);
}
本文轉自NightWolves 51CTO部落格,原文連結:http://blog.51cto.com/yangfei520/276054,如需轉載請自行聯系原作者