Hibernate 双向ManyToMany 究极解决 新增-删除-修改-查询(3)

本文主要是介绍Hibernate 双向ManyToMany 究极解决 新增-删除-修改-查询(3),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

主控方Role控制的增删改查:

 

说明都在代码注释里了,一起看方便。

package com.taomujian.dao;import java.util.List;import org.junit.Test;
import org.taomujian.dao.OrgDAO;
import org.taomujian.dao.RoleDAO;
import org.taomujian.model.Org;
import org.taomujian.model.Role;public class RoleDAOTest {/*** 完整的插入role和org及其级联关系,需要配置CascadeType.PERSIST* */@Testpublic void testSaveRole1() {RoleDAO roleDAO = new RoleDAO();Org org = new Org();org.setId("dd1");org.setName("我是被role添加的a!");Role role = new Role();role.setId("111");role.setName("我是自己role自己主动添加的a!");role.getOrgList().add(org);org.getRoleList().add(role);roleDAO.saveRole(role);}/*** 新增role数据,并添加和已经存在的org对应的级联关系到中间表中* 注:不能配置CascadeType.PERSIST,否则hibernate会插入一条记录* 		到org表中,但是因为ID相同导致插入失败*/@Testpublic void testSaveRole2(){RoleDAO roleDAO = new RoleDAO();Org org = new Org();org.setId("dd1");Role role = new Role();role.setId("111");role.setName("角色");role.getOrgList().add(org);org.getRoleList().add(role);roleDAO.saveRole(role);}/*** 只插入角色*/@Test public void testSaveRole3(){RoleDAO roleDAO = new RoleDAO();Role role = new Role();role.setId("1112");role.setName("角色");roleDAO.saveRole(role);}/*** 只增加关联关系到中间表中,需要添加CascadeType.MERGE*/@Testpublic void testSaveRole4(){RoleDAO  roleDAO = new RoleDAO();OrgDAO orgDAO = new OrgDAO();Role role = roleDAO.getRole("111");Org org = orgDAO.getOrg("dd1");org.getRoleList().add(role);    role.getOrgList().add(org);roleDAO.mergeRole(role); }/*** 只修改role表*/@Testpublic void testMergeRole1(){RoleDAO roleDAO = new RoleDAO();Role role = roleDAO.getRole("111");		role.setName("被修改的角色");roleDAO.mergeRole(role);}/*** 修改role表以及级联关系但不修改org表(注:确保没有添加CascadeType.MERGE的支持)*/@Testpublic void testMergeRole2(){RoleDAO roleDAO = new RoleDAO();Role role = roleDAO.getRole("111");		role.setName("被修改的角色");//该org记录在数据库表中已经存在Org org = new Org();org.setId("dd2");if(role.getOrgList().size()==0||!role.getOrgList().contains(org));{role.getOrgList().add(org);}//hibernate发现关联关系变化后,会先删除org_role表中相关的关联数据,然后重新插入关联关系数据roleDAO.mergeRole(role);}/*** 修改role表以及级联关系而且修改org表(注:需要增加CascadeType.MERGE的支持)*/@Testpublic void testMergeRole3(){RoleDAO roleDAO = new RoleDAO();Role role = roleDAO.getRole("111");		role.setName("被修改的角色");//修改原来存在于数据库中的数据for(Org org : role.getOrgList()){org.setName("我们都被role给修理了!");}//该org记录在数据库表中如果存在则修改,如果不存在则新增Org org = new Org();org.setId("dd3");org.setName("我被role修理了!");if(!role.getOrgList().contains(org));{role.getOrgList().add(org);}//hibernate发现关联关系变化后,会先删除org_role表中相关的关联数据,然后重新插入关联关系数据roleDAO.mergeRole(role);}/*** 删除角色:除了会删除role表中的数据也会删除关联表org_role中的数据,但不会删除org表中的数据*          不会产生脏数据*          (注:hibernate 没有提供REMOVE方法,所以无法对删除功能进行单独的配置,*          除非将cascade配置为ALL,但是这样有可能能会带来很多不想要的结果)*          *          注:在不配置cascade的情况下希望删除role的同时删除org的,可以手动删除*/@Testpublic void testRemoveRole1(){RoleDAO roleDAO = new RoleDAO();Role role = (Role) roleDAO.getRole("111");  roleDAO.removeRole(role);}/*** 只删除关联关系,CascadeType.MERGE*/@Testpublic void testRemoveRole2(){RoleDAO roleDAO = new RoleDAO();Role role = roleDAO.getRole("111");List<Org> orgList = role.getOrgList();for (int i=0;i<role.getOrgList().size();i++) {Org org = orgList.get(i);// 下面两句就是关键代码了 多对多的所有操作都必须同时操作两端的表,保存 更新 删除等都是如此org.getRoleList().remove(role); // 删除组织机构表对角色的引用role.getOrgList().remove(org);// 删除角色表对组织机构表的引用}roleDAO.mergeRole(role);}}

 

这篇关于Hibernate 双向ManyToMany 究极解决 新增-删除-修改-查询(3)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/819164

相关文章

房产证 不动产查询

陕西政务服务网(便民服务)陕西政务服务网(手机版?更直观)不动产权证书|不动产登记证明(电子证照)商品房合同备案查询权利人查询

2024.6.24 IDEA中文乱码问题(服务器 控制台 TOMcat)实测已解决

1.问题产生原因: 1.文件编码不一致:如果文件的编码方式与IDEA设置的编码方式不一致,就会产生乱码。确保文件和IDEA使用相同的编码,通常是UTF-8。2.IDEA设置问题:检查IDEA的全局编码设置和项目编码设置是否正确。3.终端或控制台编码问题:如果你在终端或控制台看到乱码,可能是终端的编码设置问题。确保终端使用的是支持你的文件的编码方式。 2.解决方案: 1.File -> S

电脑不小心删除的文件怎么恢复?4个必备恢复方法!

“刚刚在对电脑里的某些垃圾文件进行清理时,我一不小心误删了比较重要的数据。这些误删的数据还有机会恢复吗?希望大家帮帮我,非常感谢!” 在这个数字化飞速发展的时代,电脑早已成为我们日常生活和工作中不可或缺的一部分。然而,就像生活中的小插曲一样,有时我们可能会在不经意间犯下一些小错误,比如不小心删除了重要的文件。 当那份文件消失在眼前,仿佛被时间吞噬,我们不禁会心生焦虑。但别担心,就像每个问题

持久层 技术选型如何决策?JPA,Hibernate,ibatis(mybatis)

转自:http://t.51jdy.cn/thread-259-1-1.html 持久层 是一个项目 后台 最重要的部分。他直接 决定了 数据读写的性能,业务编写的复杂度,数据结构(对象结构)等问题。 因此 架构师在考虑 使用那个持久层框架的时候 要考虑清楚。 选择的 标准: 1,项目的场景。 2,团队的技能掌握情况。 3,开发周期(开发效率)。 传统的 业务系统,通常业

通过高德api查询所有店铺地址信息

通过高德api查询所有店铺地址电话信息 需求:通过高德api查询所有店铺地址信息需求分析具体实现1、申请高德appkey2、下载types city 字典值3、具体代码调用 需求:通过高德api查询所有店铺地址信息 需求分析 查询现有高德api发现现有接口关键字搜索API服务地址: https://developer.amap.com/api/webservice/gui

vue同页面多路由懒加载-及可能存在问题的解决方式

先上图,再解释 图一是多路由页面,图二是路由文件。从图一可以看出每个router-view对应的name都不一样。从图二可以看出层路由对应的组件加载方式要跟图一中的name相对应,并且图二的路由层在跟图一对应的页面中要加上components层,多一个s结尾,里面的的方法名就是图一路由的name值,里面还可以照样用懒加载的方式。 页面上其他的路由在路由文件中也跟图二是一样的写法。 附送可能存在

vue+elementui分页输入框回车与页面中@keyup.enter事件冲突解决

解决这个问题的思路只要判断事件源是哪个就好。el分页的回车触发事件是在按下时,抬起并不会再触发。而keyup.enter事件是在抬起时触发。 so,找不到分页的回车事件那就拿keyup.enter事件搞事情。只要判断这个抬起事件的$event中的锚点样式判断不等于分页特有的样式就可以了 @keyup.enter="allKeyup($event)" //页面上的//js中allKeyup(e

vue+elementui--$message提示框被dialog遮罩层挡住问题解决

最近碰到一个先执行this.$message提示内容,然后接着弹出dialog带遮罩层弹框。那么问题来了,message提示框会默认被dialog遮罩层挡住,现在就是要解决这个问题。 由于都是弹框,问题肯定是出在z-index比重问题。由于用$message方式是写在js中而不是写在html中所以不是很好直接去改样式。 不过好在message组件中提供了customClass 属性,我们可以利用

SQL Server中,查询数据库中有多少个表,以及数据库其余类型数据统计查询

sqlserver查询数据库中有多少个表 sql server 数表:select count(1) from sysobjects where xtype='U'数视图:select count(1) from sysobjects where xtype='V'数存储过程select count(1) from sysobjects where xtype='P' SE

Pycharm配置conda环境(解决新版本无法识别可执行文件问题)

引言: 很多小伙伴在下载最新版本的pycharm或者更新到最新版本后为项目配置conda环境的时候,发现文件夹目录中无法显示可执行文件(一般为python.exe),以下就是本人遇到该问题后试验和解决该问题的一些方法和思路。 一般遇到该问题的人群有两种,一种是刚入门对pycharm进行conda环境配置的小白(例如我),不熟悉相关环境配置的操作和过程,还有一种是入坑pycharm有段时间的老手