一、Hibernate多对多关联关系(双向)
(1)实体类与表间的关系
User Role t_user t_user_role t_role
int:id id:int id id id
name:String name:String name userid name
roles:set users:Set roleid
(2)、创建表语句
CREATE TABLE `t_user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(45) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `tab_user` (`id`,`name`) VALUES
(1,'admin'),
(2,'test'),
(3,'newsManger');
CREATE TABLE `t_user_role` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`userid` int(10) unsigned NOT NULL,
`roleid` int(10) unsigned NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=7 DEFAULT CHARSET=utf8;
INSERT INTO `t_user_role` (`id`,`userid`,`roleid`) VALUES
(1,1,1),
(2,1,2),
(3,1,3),
(4,3,2),
(5,2,2),
(6,2,3);
CREATE TABLE `t_role` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`rname` varchar(45) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;
INSERT INTO `t_role` (`id`,`ename`) VALUES
(1,'系统管理员'),
(2,'新闻管理员'),
(3,'广告管理员');
(3)、创建实体类与映射文件
User.java
public class User {
private int id;
private String name;
private Set roles;
public User(){
}
省略set、get方法
}
Role.java
public class Role {
private int id;
private String name;
private Set users;
public Role(){
}
省略set、get方法
}
User.hbm.xml
<hibernate-mapping>
<class name="com.keli.pojo.User" table="t_user">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="roles" table="t_user_role">
<key column="userid"/>
<many-to-many class="com.keli.pojo.Role" column="roleid"/>
</set>
</class>
</hibernate-mapping>
Role.hbm.xml
<hibernate-mapping>
<class name="com.keli.pojo.Role" table="t_role">
<id name="id">
<generator class="native"/>
</id>
<property name="name"/>
<set name="users" table="t_user_role" order-by="userid">
<key column="roleid"/>
<many-to-many class="com.keli.pojo.User" column="userid"/>
</set>
</class>
</hibernate-mapping>
(4)、测试
public class TestMany2Many2 extends TestCase {
public void testSave1(){
Session session = null;
try{
session = HibernateInitialize.getSession();
session.beginTransaction();
Role r1 = new Role();
r1.setName("数据录入人员");
session.save(r1);
Role r2 = new Role();
r2.setName("商务主管");
session.save(r2);
Role2 r3 = new Role2();
r3.setName("大区经理");
session.save(r3);
User u1 = new User();
u1.setName("菜10");
Set u1Roles = new HashSet();
u1Roles.add(r1);
u1Roles.add(r2);
u1.setRoles(u1Roles);
User u2 = new User();
u2.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(u1);
session.save(u2);
session.save(u3);
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateInitialize.closeSession();
}
}
public void testLoad1(){
Session session = null;
try{
session = HibernateInitialize.getSession();
session.beginTransaction();
User user = (User)session.load(User.class, 12);
System.out.println(user.getName());
for (Iterator iter=user.getRoles().iterator(); iter.hasNext();) {
Role role = (Role)iter.next();
System.out.println(role.getName());
}
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateInitialize.closeSession();
}
}
public void testLoad2(){
Session session = null;
try{
session = HibernateInitialize.getSession();
session.beginTransaction();
Role role = (Role)session.load(Role.class, 12);
System.out.println(role.getName());
for (Iterator iter=role.getUsers().iterator(); iter.hasNext();) {
User user = (User)iter.next();
System.out.println(user.getName());
}
session.getTransaction().commit();
}catch(Exception e){
e.printStackTrace();
session.getTransaction().rollback();
}finally{
HibernateInitialize.closeSession();
}
}
}
说明:
hibernate多对多关联映射(双向User<---->Role)
映射方法:
<set name="roles" table="t_user_role">
<key column="userid"/>
<many-to-many class="com.keli.pojo.Role" column="roleid"/>
</set>
table属性值必须和单向关联中的table属性值一致
<key>中column属性值要与单向关联中的<many-to-many>标签中的column属性值一致
在<many-to-many>中的column属性值要与单向关联中<key>标签的column属性值一致