Hibernate多对多操作

2021-06-10 04:04

阅读:610

package com.siwuxie095.hibernatetest;

   

import org.hibernate.Session;

import org.hibernate.SessionFactory;

import org.hibernate.Transaction;

import org.junit.Test;

   

import com.siwuxie095.entity.Role;

import com.siwuxie095.entity.User;

import com.siwuxie095.utils.HibernateUtils;

   

//多对多操作

public class HibernateManyToMany {

 

 

 

/**

* 多对多级联保存的复杂写法

*

*

* 手动加上 @Test 以进行单元测试(将自动导入 JUnit 4 jar 包)

*

* 选中方法名,右键->Run As->JUint Test

*/

@Test

public void testSave(){

 

SessionFactory sessionFactory=null;

Session session=null;

Transaction tx=null;

 

try {

//得到 SessionFactory 对象

sessionFactory=HibernateUtils.getSessionFactory();

//创建 Session 对象

session=sessionFactory.openSession();

//开启事务

tx=session.beginTransaction();

 

//添加两个用户,为每个用户添加两个角色

 

//(1)

//创建用户和角色对象

User user1=new User();

user1.setUserName("小白");

user1.setUserPassword("8888");

   

User user2=new User();

user2.setUserName("小黑");

user2.setUserPassword("4444");

 

Role role1=new Role();

role1.setRoleName("保镖");

role1.setRoleMemo("强大的保镖");

 

Role role2=new Role();

role2.setRoleName("秘书");

role2.setRoleMemo("漂亮的秘书");

 

Role role3=new Role();

role3.setRoleName("司机");

role3.setRoleMemo("称职的司机");

 

 

//(2)

//建立用户和角色对象的关系

//

//在用户实体类中表示角色,在角色实体类中表示用户

//

//具体:

//把角色对象放到用户对象的 Set 集合中

//把用户对象放到角色对象的 Set 集合中

//

//user1 --- role1 / role2

//user2 --- role1 / role3

//

//注意:如果建立了双向的关系,一定要有一方放弃外

//键维护权。如下

user1.getRoleSet().add(role1);

user1.getRoleSet().add(role2);

user2.getRoleSet().add(role1);

user2.getRoleSet().add(role3);

 

role1.getUserSet().add(user1);

role1.getUserSet().add(user2);

role2.getUserSet().add(user1);

role3.getUserSet().add(user2);

 

 

//(3)保存到数据库(级联保存)

session.save(user1);

session.save(user2);

session.save(role1);

session.save(role2);

session.save(role3);

 

/*

* 由于是多对多且进行了双向关联,所以一定要有一方

* 放弃外键维护权,否则将无法保存到数据库中

*

* 一般由被动方放弃外键维护权,这里角色是被动方

*

* 具体做法:

*

* 在角色的映射配置文件中的 set 标签中添加 inverse

* 属性,并将其值设置为 true

*/

 

 

//提交事务

tx.commit();

} catch (Exception e) {

//回滚事务

tx.rollback();

} finally {

//关闭资源

session.close();

sessionFactory.close();

}

}

   

/**

* 多对多级联保存的简化写法

*

* 在用户的映射配置文件中的 set 标签

* 添加 cascade 属性,并将其值设置为

* save-update

*/

@Test

public void testSaveX(){

 

SessionFactory sessionFactory=null;

Session session=null;

Transaction tx=null;

 

try {

//得到 SessionFactory 对象

sessionFactory=HibernateUtils.getSessionFactory();

//创建 Session 对象

session=sessionFactory.openSession();

//开启事务

tx=session.beginTransaction();

 

//添加两个用户,为每个用户添加两个角色

 

//(1)

//创建用户和角色对象

User user1=new User();

user1.setUserName("小白");

user1.setUserPassword("8888");

   

User user2=new User();

user2.setUserName("小黑");

user2.setUserPassword("4444");

 

Role role1=new Role();

role1.setRoleName("保镖");

role1.setRoleMemo("强大的保镖");

 

Role role2=new Role();

role2.setRoleName("秘书");

role2.setRoleMemo("漂亮的秘书");

 

Role role3=new Role();

role3.setRoleName("司机");

role3.setRoleMemo("称职的司机");

 

 

//(2)

//建立用户和角色对象的关系

//

//在用户实体类中表示角色

//

//具体:

//把角色对象放到用户对象的 Set 集合中

//

//user1 --- role1 / role2

//user2 --- role1 / role3

user1.getRoleSet().add(role1);

user1.getRoleSet().add(role2);

user2.getRoleSet().add(role1);

user2.getRoleSet().add(role3);

 

 

//(3)保存到数据库(级联保存)

session.save(user1);

session.save(user2);

 

 

//提交事务

tx.commit();

} catch (Exception e) {

//回滚事务

tx.rollback();

} finally {

//关闭资源

session.close();

sessionFactory.close();

}

}

 

 

/**

* 多对多级联删除

*

* 简化写法:在用户的映射配置文件中的 set 标签

* 添加 cascade 属性,并将其值设置为 delete

*/

@Test

public void testDelete(){

 

SessionFactory sessionFactory=null;

Session session=null;

Transaction tx=null;

 

try {

//得到 SessionFactory 对象

sessionFactory=HibernateUtils.getSessionFactory();

//创建 Session 对象

session=sessionFactory.openSession();

//开启事务

tx=session.beginTransaction();

 

//(1)

//通过 id 查询用户对象

User user=session.get(User.class, 1);

 

//(2)

//调用 Session delete() 方法实现级联删除

session.delete(user);

 

//多对多级联删除,一般不使用,仅作了解即可

//

//注意:此时角色的映射配置文件中的 set 标签

//不能将 inverse 属性设为 true,否则将无法

//删除

//

//另外:set 标签也不能将 cascade 属性设为

//delete,否则 testSaveX() 方法保存的数据

//将全部删除

 

 

//提交事务

tx.commit();

} catch (Exception e) {

//回滚事务

tx.rollback();

} finally {

//关闭资源

session.close();

sessionFactory.close();

}

}

 

 

/**

* 维护第三张表

*/

@Test

public void testTable(){

 

SessionFactory sessionFactory=null;

Session session=null;

Transaction tx=null;

 

try {

//得到 SessionFactory 对象

sessionFactory=HibernateUtils.getSessionFactory();

//创建 Session 对象

session=sessionFactory.openSession();

//开启事务

tx=session.beginTransaction();

 

//让某个用户有某个角色

 

//(1)根据 id 查询用户对象和角色对象

User user=session.get(User.class, 1);

Role role=session.get(Role.class, 3);

 

//(2)把角色对象放到用户对象的 Set 集合中

user.getRoleSet().add(role);

 

 

 

//让某个用户没有某个角色

 

//(1)根据 id 查询用户对象和角色对象

User userx=session.get(User.class, 1);

Role rolex=session.get(Role.class, 1);

 

//(2)从用户对象的 Set 集合中移除角色对象

userx.getRoleSet().remove(rolex);

 

 

//提交事务

tx.commit();

} catch (Exception e) {

//回滚事务

tx.rollback();

} finally {

//关闭资源

session.close();

sessionFactory.close();

}

}

}


评论


亲,登录后才可以留言!