Code Bye

hibernate 多对多双向关联的异常。更新数据时中间表会先执行删除,再插入!求指导释啊

例如用户和用户组   , 一个user属于多个group  ,一个group可以有多个user
现在数据库中有一个user(id=3)和一个group(id=1)

这时同时想把use(id=3)r分配到group(id=2)下
Set<Group> groups = new HashSet<>();
Gropu group = groupService.get(3);
groups.add(group);
user.setGroups(groups)  ;
userService.update(user);
这时更新是 hibernate先执行了删除再插入

最后数据表成了3,1

这显示是不满足需求的啊!
有人遇到相似问题吗?
高手在哪里?求指导释啊
解决方案

40

引用:
Quote: 引用:

Set<Group> groups = new HashSet<>();
 Gropu group3 = groupService.get(3);
Gropu group2 = groupService.get(2);
groups.add(group3);
groups.add(group2);

user.setGroups(groups)  ;
userService.update(user);
你设置的就一个关系,数据库肯定就一个值!
一般来说:你先查询出之前的groups,再把新想要添加的group放进去,然后更新操作。

每次一次操作都要先把原来的set查出来,然后再add进去吗?
这样会不会效率很低,不能直接只插入吗?
而且执行update(user)的时候,hibernate会先去更新一次user里面的字段(update user set xxx=xxx,…)
但是user值并没有改变啊,问一下还有其他的方法来更新user和group的关联吗?

第一个问题回答:假如你设置了级联关系,user对象已经包含了group的set,新添加add,只需要user.getGroups.add(新的);
假如你不查出来,程序怎么样知道,你不是想要删除旧的记录,而是想要新添加呢?
第二个问题:性能方面,假如关联表设置的当,原有记录存在,只会添加新的,不会删除旧的;不存在你说的性能问题!
第三点:优化方面 本人是有一些方法,但是 很久没留意了  怕印象有误。  所以本人想说的是,Hibernate本身就是面向对象的ORM,如想精准控制,就用JDBC吧,Hibernate不是不能,可以通过配置文件配置,但有些复杂,得不偿失;没有必要为这点性能顾虑太多,若是真要求高性能,Hibernate肯定不会用的


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明hibernate 多对多双向关联的异常。更新数据时中间表会先执行删除,再插入!求指导释啊