Hibernate多对多中间表数据更新问题

最近在做oa系统:角色(Role)和权限(Privilege) 是多对多关系,实体类关系映射采用注解方式

//角色类中映射权限关系@ManyToMany
public Set<Privilege> getPrivileges() {
    return privileges;
}
//权限类中映射角色关系@ManyToMany(mappedBy="privileges")
public Set<Role> getRoles() {
    return roles;
}
//部分更新功能代码:1.设置角色中的权限属性;2.更新到数据库role.setPrivileges(new HashSet<Privilege>(privilegeList));
roleService.update(role);

这种配置下中间表会更新,但是如果mappedBy放在角色类中,再更新角色的话,中间表则不会更新,后台也不会报错。

简单说明,因为在权限类中使用了mappedBy指向了角色对象中的privileges,这样的意思就是只能通过角色操作来做中间表(role_privilege)维护工作。

如果mappedBy放在角色类中指向权限对象中的roles,则通过角色来做维护的时候,中间表是不会做任何数据修改工作的,只能通过权限维护操作中间表(privilege_role)。

注:不知道为何Hibernate会有这个限制。

时间: 2024-10-09 19:06:40

Hibernate多对多中间表数据更新问题的相关文章

hibernate多对多中间表设计

hibernate多对多中间表,一般都是两个外键,例如 用户表(user),主键:userid. 角色表(role),主键:roleid. 中间表字段为两个外键:userid,roleid作为联合主键. 但是如果想在中间表加一个字段作为单独的主键,即设置一个字段id作为主键.并且数据库采用的是oracle数据库,主键不能自增.那么采用hibernate向中间表插数据的时候,就会出现问题,即主键id字段插入为空,会报错误. 由于oracle不支持自动编号,为解决以上错误,我们还得为oracle数据

Hibernate 多对多 中间表含有其他字段 注解方式实现

需求: 两个实体类:Teacher.class Student.class 中间表包含了一个额外字段:score Teacher.calss id name 1 Mr.zhang 2 Mr.wang Student.class id name 1 Xiaoming 2 Xiaohong 中间表 id teacher_id student_id score 1 1 1 89 2 1 2 90 解决办法: 按照传统的多对多注解实现,中间表是以自身id为默认主键,另外包含了两个实体类的id,共3个字段

Hibernate多对一,多对多的表映射关系

版权声明:本文为博主原创文章,未经博主允许不得转载. 本文旨在介绍hibernate的实体与数据库表的各种关系映射 1.多对一/一对多关系映射 User-------用户表 Department -------------部门表 Contact---------------组件部分,(地址类)) 下面开始各实体代码: User.java实体类 package com.huangchao.model; import java.io.Serializable; import java.util.Da

Hibernate多对多关系映射(建表)

下边讲述Hibernate多对多关系映射. 多对多关系的表的结构为: 两个实体表,还包含一个关系表,关系表为复合主键,如果要使用Hibernate多对多关系映射,则关系表必须只包含两个字段,如果生成了Hibernate多对多关系映射,则中间关系表不会生成实体(即没有对应的pojo类,更没有其映射文件). 1.建立表 DROP TABLE user_course ; DROP TABLE user ; DROP TABLE course ; CREATE TABLE user ( userid  

hibernate建表多对多建表

Student.java 1 package cn.itcast.hiberate.sh.domain; 2 3 import java.util.Set; 4 5 public class Student { 6 private Long sid; 7 private String sname; 8 private String description; 9 Set<Course> courses; 10 11 12 public Set<Course> getCourses()

Hibernate多对多级联操作

表与表之间关系回顾(重点) 2 多对多 (1)订单和商品关系,一个订单里面有多个商品,一个商品属于多个订单 (2)用户和角色多对多关系 - 用户: 小王.小马.小宋 - 角色:总经理.秘书.司机.保安 ** 比如小王 可以 是总经理,可以是司机 ** 比如小宋 可以是司机,可以是秘书,可以保安 ** 比如小马 可以是 秘书,可以是总经理 -          一个用户里面可以有多个角色,一个角色里面可以有多个用户 (3)多对多建表:创建第三张表维护关系 Hibernate多对多操作 多对多映射配

SSH学习 Hibernate 多对多

Hibernate 多对多关系的处理,是把两个po类(持久化类)分别建表,这两个是要自己写po类和对应的映射文件,两个表的关系另外再建一张表,这个关系表不需要有对应的类,只需在映射文件写必要的标签即可 注明一点:fetch = "join" fetch参数指定了关联对象抓取的方式是select查询还是join查询,select方式时先查询返回要查询的主体对象(列表),再根据关联外键id,每一个对象发一个select查询,获取关联的对象,形成n+1次查询: 而join方式,主体对象和关联

hibernate 多对多一个对象出现多条记录问题

hibernate 多对多时,当需要根据它关联的对象查找的时候,会出现一个对象有多条记录的问题 用 left join fetch 抓取查询的时候还是会出现这问题,是因为主表在关联表中有多条记录 用 select distinct d from Demand d inner join d.skillS s where d.timekey > -1 关键字 distinct 可以来保证一个对象只有一条记录 hibernate 多对多一个对象出现多条记录问题

【SSH高速进阶】——Hibernate 多对多映射

说到多对多关系.印象最深刻的就是大学的选修课.一个学生能够选修多门课程,一门课程能够有多个学生选修,学生所选的每一门课程还有成绩. 这个场景的E-R图例如以下: 对于多对多的关系,我们一般会抽出一张中间表(连接表),来负责维护这两张表的多对多关系.比方上述关系应该生成的表结构为: PO对象 Student.java public class Student { private int id; private String name; private Set<Course> courses; /