hibernate多对多关系操作
来源:互联网 发布:小红书是什么软件 编辑:程序博客网 时间:2024/05/19 20:56
hibernate多对多当中,我们常常希望只删除一方已及对应的关系,但不想删除另一方,怎么样达到呢? (这里只提删除)
表user和表role多对多,中间表user_role(userId,roleId),user是主控方,role是从方,
在spring+hibernate的环境下,使用的是Annotation配置
User.java
@ManyToMany(cascade = {CascadeType.MERGE,CascadeType.PERSIST}, fetch = FetchType.EAGER)
@JoinTable(name = "user_role",
joinColumns = { @JoinColumn(name = "userId",referencedColumnName="userId") },
inverseJoinColumns = { @JoinColumn(name = "roleId",referencedColumnName="roleId") })
public Set<Role> getRoles() {
return this.roles;
}
Role.java
@ManyToMany(cascade = {CascadeType.MERGE,CascadeType.PERSIST}, fetch = FetchType.EAGER,
mappedBy = "roles")
public Set<User> getUsers() {
return this.users;
}
测试:主控方User删除,user会被删除,user_role的中的关系也会被删除了,但对应的role不会被删除
@Test
public void testDelete() {
User user = userDao.findById(8);
userDao.delete(user);
}
测试:从方Role删除,如果user_role里面没有对应的roleId,role可以删除,user不会被删除
@Test
public void testDelete() {
Role role = roleDao.findById(26);
roleDao.delete(role);
}
测试:从方Role删除,如果user_role里面有对应的roleId和别的userId关联,role不能被删除
@Test
public void testDelete() {
Role role = roleDao.findById(26);
roleDao.delete(role);
}
会报错:org.springframework.dao.DataIntegrityViolationException: Could not execute JDBC batch update; nested exception is org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
Caused by: org.hibernate.exception.ConstraintViolationException: Could not execute JDBC batch update
Caused by: java.sql.BatchUpdateException: Cannot delete or update a parent row: a foreign key constraint fails (`hrms`.`user_role`, CONSTRAINT `roleId` FOREIGN KEY (`roleId`) REFERENCES `role` (`roleId`) ON DELETE NO ACTION ON UPDATE NO ACTION)
解决方案:在数据库里更改user_role表结构,就是添加约束,就添加roleId的删除时进行级联操作
ALTER TABLE `hrms`.`user_role`
ADD CONSTRAINT `roleId`
FOREIGN KEY (`roleId` )
REFERENCES `hrms`.`role` (`roleId` )
ON DELETE CASCADE;
测试:从方Role删除,如果user_role里面有对应的roleId,现在role可以删除,user_role里面对应的关系也会被删除,但对应的user不会被删除,达到我们想要的效果
@Test
public void testDelete() {
Role role = roleDao.findById(26);
roleDao.delete(role);
}
- Hibernate操作多对多关系
- hibernate多对多关系操作
- Hibernate中的表的多对多关系及操作
- hibernate 多对多关系
- Hibernate多对多关系
- hibernate 多对多关系
- hibernate关联关系之多对多关系
- Hibernate关系映射之多对多关系
- Hibernate的多对多关联关系
- hibernate annotion多对多关系示例
- Hibernate学习笔记---------------多对多关系
- hibernate多对多关联关系
- Hibernate的关系映射多对多
- hibernate 多对多关系补充
- hibernate之映射关系多对多
- hibernate 映射关系 多对多
- hibernate移植多对多关系
- hibernate实现多对多的关系
- Mysql5.7.20压缩版下载和安装
- 关于网站发布的一些问题
- codeforeces Round #441B
- java 从键盘输入n个数,升序输出
- SSH框架文件上传+下载
- hibernate多对多关系操作
- Andrew NG 机器学习 笔记-week6-应用机器学习的建议 ( Advice for Applying Machine Learning)
- SDE连接,创建数据集,数据导入以及数据导出
- 二叉树的创建及前序、中序、后序、层序遍历
- properties文件读取工具类
- 解码Base64并展示图片
- wpf ui分析工具 Snoop
- Kylin启动异常:java.lang.outofMemoryError:Requested array size exceeds VM limit
- Java线程池实现原理