一.hibernate多對多映射(單項),自動產生第三張表
User--à Role
user(id,name) role(id,name)
User類:
private int id; private String name; private Set roles;
Role類:
private int id; private String name;
User.hbm.xml中:
<set name=”roles” table=”t_user_role”>
<key column=”userid” />
<many-to-many class=”com.Role” column=”roleid” />
</set>
這樣,hibernate會自動產生中間表t_user_role(userid,roleid) 并且是復合主鍵,userid為t_user的外鍵,roleid為t_role的外鍵
二.hibernate多對多的存儲
Role r1 = new Role();
r1.setName(“數據錄入人員”);
Role r2 = new Role();
r2.setName(“商務主管”);
Role r3 = new Role();
r3.setName(“大區經理”);
User u1 = new User();
u1.setName(“10”);
Set u1Roles = new HashSet();
u1Roles.add(r1);
u1Roles.add(r2);
u1.setRoles(u1Roles);
User u2 = new User();
u1.setName(“祖兒”);
Set u2Roles = new HashSet();
u2Roles.add(r2);
u2Roles.add(r3);
u2.setRoles(u2Roles);
User u3 = new User();
u3.setName(“杰倫”);
Set u3Roles = new HashSet();
u3Roles.add(r1);
u3Roles.add(r2);
u3Roles.add(r3);
u3.setRoles(u3Roles);
session.save(r1);
session.save(r2);
session.save(r3);
session.save(u1);
session.save(u2);
session.save(u3);
結束之后,在第三張表中也有數據
三.hibernate多對多的加載
User user = (User)session.load(User.class,1);
System.out.println(user.getName());
for(Iterator iter = user.getRoles().iterator();iter.hasNext();){
Role role = (Role)iter.next();
System.out.println(role.getName());
}
每次加載都會發出sql語句
三.hibernate多對多的 雙向映射
User ß--.-àRole
user(id,name) role(id,name)
User類:
private int id; private String name; private Set roles;
Role類:
private int id; private String name; private Set users;
User.hbm.xml中:
<set name=”roles” table=”t_user_role”>
<key column=”userid” />
<many-to-many class=”com.Role” column=”roleid” />
</set>
Role.hbm.xml中:
<set name=”roles” table=”t_user_role”> //這里可以設置order-by=”userid”,根據userid排序
<key column=”roleid” />
<many-to-many class=”com.User” column=”userid” />
</set>
注意,上面中間表名字是一樣的
這樣,hibernate也會自動產生中間表t_user_role(userid,roleid) 并且是復合主鍵,userid為t_user的外鍵,roleid為t_role的外鍵