Hibernate多对多操作
2021-06-10 04:04
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();
}
}
}
上一篇:AJAX 状态值与状态码详解
下一篇:HTML 基本标签01