多对多的测试代码
-
添加测试
/*
* 多对多的测试
*/
@Test
public void m2m() {
Session session = HibernateUtils.getCurrentSession();
Transaction tr = session.beginTransaction();
//创建两个user
User u1 = new User();
User u2 = new User();
u1.setUsername("u1");
u2.setUsername("u2");
//创建两个角色
Role r1 = new Role();
Role r2 = new Role();
r1.setRname("程序员");
r2.setRname("PM");
//设置关联
u1.getRoles().add(r1);
u1.getRoles().add(r2);
u2.getRoles().add(r1);
//保存设置了级联的方向
session.save(u1);
session.save(u2);
tr.commit();
}
表结构
- 多对多关联修改、删除的测试
/*
* 多对多的删除关联测试
* 一般不会做直接删除操作,用操作中间表来处理。
*/
@Test
public void m2mDU() {
Session session = HibernateUtils.getCurrentSession();
Transaction tr = session.beginTransaction();
//查找user与role
User u1 = session.get(User.class, 1L);
User u2 = session.get(User.class, 2L);
Role r1 = session.get(Role.class, 1L);
Role r2 = session.get(Role.class, 2L);
//删除id为1的role
u1.getRoles().remove(r1);
//为u2添加角色r2
u2.getRoles().add(r2);
tr.commit();
}
操作后的结果
JavaBean 标准生成就可以
bean的配置文件
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 配置类和表结构的映射 -->
<class name="domain.User" table="sys_user">
<!-- 配置id
见到name属性,JavaBean的属性
见到column属性,是表结构的字段
-->
<id name="uid" column="uid">
<!-- 主键的生成策略 -->
<generator class="native"/>
</id>
<!-- 乐观锁,就使用version标签,暂时不适用 -->
<!--<version name="version"/>-->
<!-- 配置其他的属性 -->
<property name="username" column="username"/>
<property name="password" column="password"/>
<!-- 多对多设置 -->
<!-- cascade为级联操作
* none 不使用级联
* save-update 级联保存或更新
* delete 级联删除
* delete-orphan 孤儿删除.(注意:只能应用在一对多关系)
* all 除了delete-orphan的所有情况.(包含save-update delete)
* all-delete-orphan 包含了delete-orphan的所有情况.(包含save-update delete delete-orphan)
save-update,delete,
-->
<!--
多对多需要设置table属性,是中间表的名字
控制较多的一方设置级联保存,较少的一方设置放弃维护外键
必须由一方放弃。
-->
<set name="roles" table="sys_user_role" cascade="save-update">
<!-- 中间表中外键的名字 -->
<key column="uid"/>
<!-- class:关联的另一方的多的类全路径.column:另一方在中间表中的外键名称: -->
<many-to-many class="domain.Role" column="rid" />
</set>
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<!-- 配置类和表结构的映射 -->
<class name="domain.Role" table="sys_role">
<id name="rid" column="rid">
<generator class="native"/>
</id>
<property name="rname" column="rname"/>
<!--
多对多需要设置table属性,是中间表的名字
控制较多的一方设置级联保存,较少的一方设置放弃维护外键
必须由一方放弃。
-->
<set name="users" table="sys_user_role" inverse="true">
<!-- 中间表中外键的名字 -->
<key column="rid"/>
<!-- class:关联的另一方的多的类全路径.column:另一方在中间表中的外键名称: -->
<many-to-many class="domain.User" column="uid" />
</set>
</class>
</hibernate-mapping>
主配置文件中不要忘记加载配置文件
<mapping resource="domain/User.hbm.xml"/>
<mapping resource="domain/Role.hbm.xml"/>