★多对多关联映射_单向(用户→角色) ★多对多关联映射_双向(用户<-->角色)1.多对多关联映射_单向(用户→角色) 多对多关联映射,需要一张中间表建立关系才可以体现出多对多关系 --- 举例说明: ①新建User.java和Role.java User.java代码如下: public class User { private int id; private String name; //体现用户可以有多个角色 private Set roles;public Set getRoles() { return roles; } public void setRoles(Set roles) { this.roles = roles; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } Role.java代码如下: public class Role { private int id; private String name;public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } --- ②新建Role.hbm.xml和User.hbm.xml Role.hbm.xml代码如下: <hibernate-mapping> <class name="com.lxl.bean.Role" table="t_role"> <id name="id"> <generator class="native"> </generator> </id> <property name="name"></property> </class> </hibernate-mapping> User.hbm.xml代码如下: <hibernate-mapping> <class name="com.lxl.bean.User" table="t_user"> <id name="id"> <generator class="native"></generator> </id> <property name="name"></property> <!-- table="t_user_role" 多对多关系中,中间表的名称 hibernate会自动生成 --> <set name="roles" table="t_user_role"> <!-- column="userid" 将t_user表的主键在中间表 生成一个叫userid的字段 --> <key column="userid"></key> <!-- 体现多对多关系 --> <many-to-many class="com.lxl.bean.Role" column="roleid"></many-to-many> </set> </class> </hibernate-mapping> --- ③在hibernate.cfg.xml中将Role.hbm.xml和User.hbm.xml配置 ... <mapping resource="com/lxl/bean/User.hbm.xml"/> <mapping resource="com/lxl/bean/Role.hbm.xml"/> </session-factory> --- ④利用ExportDB.java建表以及创建工厂的HibernateUtils.java 拷贝过来 --- ⑤新建测试类ManytomanyTest,继承于TestCase //方法testManytomany()保存数据 public void testManytomany(){ Session session = null; Transaction tx = null; try { session = HibernateUtils.getSession(); tx = session.beginTransaction();
//角色:发布人员 Role role1 = new Role(); role1.setName("发布人员"); session.save(role1);
//角色:审核人员 Role role2 = new Role(); role2.setName("审核人员"); session.save(role2);
//用户:lxl //角色:发布人员,审核人员 User user1 = new User(); user1.setName("lxl"); Set userset1 = new HashSet(); userset1.add(role1); userset1.add(role2); user1.setRoles(userset1); session.save(user1);
//用户:pw //角色:发布人员 User user2 = new User(); user2.setName("pw"); Set userset2 = new HashSet(); userset2.add(role1); user2.setRoles(userset2); session.save(user2);
User user = (User) session.load(User.class, 3); System.out.println("用户名:"+user.getName()); for(Iterator iterator = user.getRoles().iterator();iterator.hasNext();){ Role role = (Role) iterator.next(); System.out.println("对应的角色:"+role.getName()); }
tx.commit(); } catch (Exception e) { e.printStackTrace(); tx.rollback(); }finally{ HibernateUtils.closeSession(session); } }2.多对多关联映射_双向(用户<-->角色) 需要修改Role.java和Role.hbm.xml的代码, Role.java需要修改的代码如下: public class Role { private int id; private String name; //体现角色可以有多个用户 private Set users;public Set getUsers() { return users; } public void setUsers(Set users) { this.users = users; } public int getId() { return id; } public void setId(int id) { this.id = id; } public String getName() { return name; } public void setName(String name) { this.name = name; } } Role.hbm.xml需要修改的代码如下: <hibernate-mapping> <class name="com.lxl.bean.Role" table="t_role"> <id name="id"> <generator class="native"> </generator> </id> <property name="name"></property> <set name="users" table="t_user_role"> <key column="roleid"></key> <many-to-many class="com.lxl.bean.User" column="userid"></many-to-many> </set> </class> </hibernate-mapping> ----- 因为双向的保存数据与单向相同,我们就不演示了 显示一下加载 //测试加载(双向) public void testManytomany3(){ Session session = null; Transaction tx = null; try { session = HibernateUtils.getSession(); tx = session.beginTransaction();
Role role = (Role) session.load(Role.class, 1); System.out.println("角色名:"+role.getName()); for(Iterator iterator = role.getUsers().iterator();iterator.hasNext();){ User user = (User) iterator.next(); System.out.println("对应的用户:"+user.getName()); }
我在项目中创建实体类,形成role,right类还有它们的映射,在映射中配置它们的ID为自增,
添加的时候,中间表没有插入成功,缺少中间表的ID,因为Oracle的Id不是没有自增吗,怎么办??
★多对多关联映射_双向(用户<-->角色)1.多对多关联映射_单向(用户→角色)
多对多关联映射,需要一张中间表建立关系才可以体现出多对多关系
---
举例说明:
①新建User.java和Role.java
User.java代码如下:
public class User {
private int id;
private String name;
//体现用户可以有多个角色
private Set roles;public Set getRoles() {
return roles;
}
public void setRoles(Set roles) {
this.roles = roles;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Role.java代码如下:
public class Role {
private int id;
private String name;public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
---
②新建Role.hbm.xml和User.hbm.xml
Role.hbm.xml代码如下:
<hibernate-mapping>
<class name="com.lxl.bean.Role" table="t_role">
<id name="id">
<generator class="native">
</generator>
</id>
<property name="name"></property>
</class>
</hibernate-mapping>
User.hbm.xml代码如下:
<hibernate-mapping>
<class name="com.lxl.bean.User" table="t_user">
<id name="id">
<generator class="native"></generator>
</id>
<property name="name"></property>
<!-- table="t_user_role"
多对多关系中,中间表的名称
hibernate会自动生成
-->
<set name="roles" table="t_user_role">
<!-- column="userid"
将t_user表的主键在中间表
生成一个叫userid的字段
-->
<key column="userid"></key>
<!-- 体现多对多关系 -->
<many-to-many class="com.lxl.bean.Role" column="roleid"></many-to-many>
</set>
</class>
</hibernate-mapping>
---
③在hibernate.cfg.xml中将Role.hbm.xml和User.hbm.xml配置
...
<mapping resource="com/lxl/bean/User.hbm.xml"/>
<mapping resource="com/lxl/bean/Role.hbm.xml"/>
</session-factory>
---
④利用ExportDB.java建表以及创建工厂的HibernateUtils.java
拷贝过来
---
⑤新建测试类ManytomanyTest,继承于TestCase
//方法testManytomany()保存数据
public void testManytomany(){
Session session = null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
//角色:发布人员
Role role1 = new Role();
role1.setName("发布人员");
session.save(role1);
//角色:审核人员
Role role2 = new Role();
role2.setName("审核人员");
session.save(role2);
//用户:lxl
//角色:发布人员,审核人员
User user1 = new User();
user1.setName("lxl");
Set userset1 = new HashSet();
userset1.add(role1);
userset1.add(role2);
user1.setRoles(userset1);
session.save(user1);
//用户:pw
//角色:发布人员
User user2 = new User();
user2.setName("pw");
Set userset2 = new HashSet();
userset2.add(role1);
user2.setRoles(userset2);
session.save(user2);
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
//测试加载(因为是单向的,所以只能由user→role)
public void testManytomany2(){
Session session = null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
User user = (User) session.load(User.class, 3);
System.out.println("用户名:"+user.getName());
for(Iterator iterator = user.getRoles().iterator();iterator.hasNext();){
Role role = (Role) iterator.next();
System.out.println("对应的角色:"+role.getName());
}
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtils.closeSession(session);
}
}2.多对多关联映射_双向(用户<-->角色)
需要修改Role.java和Role.hbm.xml的代码,
Role.java需要修改的代码如下:
public class Role {
private int id;
private String name;
//体现角色可以有多个用户
private Set users;public Set getUsers() {
return users;
}
public void setUsers(Set users) {
this.users = users;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Role.hbm.xml需要修改的代码如下:
<hibernate-mapping>
<class name="com.lxl.bean.Role" table="t_role">
<id name="id">
<generator class="native">
</generator>
</id>
<property name="name"></property>
<set name="users" table="t_user_role">
<key column="roleid"></key>
<many-to-many class="com.lxl.bean.User" column="userid"></many-to-many>
</set>
</class>
</hibernate-mapping>
-----
因为双向的保存数据与单向相同,我们就不演示了
显示一下加载
//测试加载(双向)
public void testManytomany3(){
Session session = null;
Transaction tx = null;
try {
session = HibernateUtils.getSession();
tx = session.beginTransaction();
Role role = (Role) session.load(Role.class, 1);
System.out.println("角色名:"+role.getName());
for(Iterator iterator = role.getUsers().iterator();iterator.hasNext();){
User user = (User) iterator.next();
System.out.println("对应的用户:"+user.getName());
}
tx.commit();
} catch (Exception e) {
e.printStackTrace();
tx.rollback();
}finally{
HibernateUtils.closeSession(session);
}
}
在控制台我们可以看到:
角色名:发布人员
对应的用户:pw
对应的用户:lxl
也许有的人发现了,用户的显示顺序并不是按照我们保存用户时的顺序显示的
那么,怎么办?
hibernate提供了一个属性:order-by
...
<set name="users" table="t_user_role" order-by="userid">
...
order-by="userid"表示按照用户的主键排序,再次运行testManytomany3()
你可以在控制台看到:
角色名:发布人员
对应的用户:lxl
对应的用户:pw