JavaBean的编写

Person

private long pid ;
private String name ; private Set<Role> roles = new HashSet<Role>();
//省略get/set/无参构造

Role

private long rid ;
private String name ; private Set<Person> persons = new HashSet<Person>();
//省略get/set/无参构造

配置文件编写

person.hbm.xml(放弃外键维护,多对多必须有一方放弃外键维护)

    <!-- table 表在数据库的名字 -->
<class name="com.hibernateday3.domain.Person" table="sys_person"> <id name="pid" column="pid">
<generator class="native"/>
</id> <property name="name" column="name"/> <!--
name:当前对象的集合
table:中间表的名字
column:当前对象在中间表的字段
class:集合对象的路径
column:集合对象在中间表的字段
-->
<set name="roles" table="sys_person_role">
<key column="pid"/>
<many-to-many class="com.hibernateday3.domain.Role" column="rid"/>
</set> </class>

role.hbm.xml

    <!-- table 表在数据库的名字 -->
<class name="com.hibernateday3.domain.Role" table="sys_role"> <id name="rid" column="rid">
<generator class="native"/>
</id> <property name="name" column="name"/> <!--
name:当前对象的集合
table:中间表的名字
column:当前对象在中间表的字段
class:集合对象的路径
column:集合对象在中间表的字段
-->
<set name="persons" table="sys_person_role" inverse="true">
<key column="rid"/>
<many-to-many class="com.hibernateday3.domain.Person" column="pid"/>
</set> </class

核心文件中配置映射

        <mapping resource="com/hibernateday3/domain/Person.hbm.xml"/>
<mapping resource="com/hibernateday3/domain/Role.hbm.xml"/>

测试:

1.双向保存

/**
* 测试多对多:双向保存
* 必须要有一份放弃维护外键
*/
@Test
public void m01(){ Session session = HibernateUtils.openSession();
Transaction tr = session.beginTransaction(); //创建对象
Person p1 = new Person();
p1.setName("人物一");
Person p2 = new Person();
p2.setName("人物二");
Role r1 = new Role();
r1.setName("角色1");
Role r2 = new Role();
r2.setName("角色1");
//-----------------保存数据 //人物一:角色1+角色2
p1.getRoles().add(r1);
p1.getRoles().add(r2);
r1.getPersons().add(p1);
r2.getPersons().add(p1); //人物二:角色1
p2.getRoles().add(r1);
r1.getPersons().add(p1); //保存
session.save(p1);
session.save(p2);
session.save(r1);
session.save(r2); //-----------------释放资源
tr.commit();
session.close();
}

2.级联保存(在没有放弃外键的一方添加cascsde)

Person.hbm.xml

<set name="roles" table="sys_person_role" cascade="save-update">
    /**
* 测试多对多:级联保存保存
* 在没有放弃外键的一方添加cascsde
*/
@Test
public void m02(){ Session session = HibernateUtils.openSession();
Transaction tr = session.beginTransaction(); //创建对象
Person p1 = new Person();
p1.setName("人物一");
Person p2 = new Person();
p2.setName("人物二");
Role r1 = new Role();
r1.setName("角色1");
Role r2 = new Role();
r2.setName("角色1");
//-----------------保存数据 //人物一:角色1+角色2
p1.getRoles().add(r1);
p1.getRoles().add(r2); //人物二:角色1
p2.getRoles().add(r1); //保存
session.save(p1);
session.save(p2); //-----------------释放资源
tr.commit();
session.close();
}

3.让人物一失去角色1

    /**
* 测试多对多:让人物一没有角色1
*
*/
@Test
public void m03(){ Session session = HibernateUtils.openSession();
Transaction tr = session.beginTransaction(); //-----------------获取数据
Person p1 = session.get(Person.class, 1l);
Role r1 = session.get(Role.class, 1l); //保存
p1.getRoles().remove(r1); //-----------------释放资源
tr.commit();
session.close();
}

在多对多中一般不使用级联删除

最新文章

  1. redis实战(01)_redis安装
  2. 《CMake实践》笔记三:构建静态库(.a) 与 动态库(.so) 及 如何使用外部共享库和头文件
  3. Sublime相关
  4. Java实现事件机制
  5. Windows 错误代码
  6. Python练习题 026:求100以内的素数
  7. 用scikit-learn实现朴素贝叶斯分类器 转
  8. html5视频小站
  9. 在MFC对话框中添加状态栏
  10. 泛型里的super和extend
  11. UNIX网络编程——进程间通信概述
  12. 初识异步、并发处理纯代码及Demo
  13. vue项目部署到服务器
  14. T-SQL LIKE子句 模糊查询
  15. TestSushu1
  16. shiro中INI配置
  17. Qt绘制字体并获取文本宽度
  18. 微服务之springCloud-docker-feign-hystrix(六)
  19. 标绘ol3版开源啦
  20. PHP的XML Parser(转)

热门文章

  1. js 高级 原型与原型链
  2. java继承,多态
  3. code+第四次网络赛div2
  4. 不会在CentOS 8上安装htop?今天教你正确安装
  5. Windows dir
  6. 基于vue的环信基本实时通信功能
  7. pycharm同时使用python2.7和python3.5设置方法
  8. ps快速将白底图片变为透明图片
  9. VS2017+QT5.12环境配置与动态链接库的生成
  10. Tomcat的优化技巧