關聯映射方面的最後一篇了,我覺得映射檔案的編寫是使用hibernate的基礎,而關聯映射又是基礎的基礎,是以這方面分的細一些,羅嗦一些,說明白就好,呵呵。
多對多關聯(雙向),相對單向,在實體上就是一端也保持另一端的對象集合,在映射檔案中也配置上。但是要注意兩邊配置檔案中指定的外鍵一定要對應。
1.對象模型:
2.關系模型:
3.實體類:
Player.java
public class Player {
private Integer id;
private String name;
private Set<Role> roles;
//一系列的setter.getter方法
@Override
public String toString() {
return "Player: " + name;
}
}
Role.java
public class Role {
private Set<Player> players;
return "Role: " + name;
4.映射檔案:
Player.hbm.xml
<class name="com.sxt.hibernate.many2many.entity.Player" table="sxt_hibernate_player">
<id name="id" length="4">
<generator class="native"></generator>
</id>
<property name="name" length="10"></property>
<!--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>
</class>
Role.hbm.xml
<class name="com.sxt.hibernate.many2many.entity.Role" table="sxt_hibernate_role">
<set name="players" table="sxt_hibernate_player_role" cascade="save-update">
<!-- 注意這裡指定的外鍵要和另一端映射檔案中的相對應 -->
<key column="role_id"></key>
<many-to-many class="com.sxt.hibernate.many2many.entity.Player" column="player_id"></many-to-many>
5.hibernate配置檔案:
參照上一篇。
6. 測試方法:
public static void main(String[] args) {
Session session = HibernateUtils.getSession();
Transaction t = session.beginTransaction();
try {
/**
* 測試插入資料
*/
/* Player player1=new Player();
player1.setName("姚明");
Player player2=new Player();
player2.setName("詹姆斯");
Player player3=new Player();
player3.setName("科比");
Role role1=new Role();
role1.setName("中鋒");
Set<Player> players1=new HashSet<Player>();
players1.add(player1);
players1.add(player2);
role1.setPlayers(players1);
Role role2=new Role();
role2.setName("後衛");
Set<Player> players2=new HashSet<Player>();
players2.add(player2);
players2.add(player3);
role2.setPlayers(players2);
session.save(role1);
session.save(role2);*/
* 測試加載資料
*/
Role role=(Role)session.load(Role.class, 4);
System.out.println(role);
for(Iterator<Player> players=role.getPlayers().iterator();players.hasNext();){
System.out.println(players.next());
}
t.commit();
} catch (HibernateException e) {
e.printStackTrace();
t.rollback();
} finally {
HibernateUtils.closeSession(session);
}
}
本文轉自NightWolves 51CTO部落格,原文連結:http://blog.51cto.com/yangfei520/276187,如需轉載請自行聯系原作者