hibernate 多对多双向关联的异常,更新数据时中间表会先执行删除

J2EE 码拜 9年前 (2015-04-05) 1621次浏览 0个评论

比如用户和用户组   , 一个user属于多个group  ,一个group可以有多个user
现在数据库中有一个user(id=3)和一个group(id=1)
hibernate 多对多双向关联的异常,更新数据时中间表会先执行删除
这时同时想把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先执行了删除再插入
hibernate 多对多双向关联的异常,更新数据时中间表会先执行删除

最后数据表成了3,1
hibernate 多对多双向关联的异常,更新数据时中间表会先执行删除
这显示是不满足需求的啊!
有人遇到类似问题吗?
大神在哪里?求解释啊

hibernate 多对多双向关联的异常,更新数据时中间表会先执行删除
自己顶! 弄了一下午了,这个问题一直没解决,不知道怎么回事
hibernate 多对多双向关联的异常,更新数据时中间表会先执行删除
表是否有主外键约束;你把Hibernate配置内容列出来瞧一瞧哈。
hibernate 多对多双向关联的异常,更新数据时中间表会先执行删除
级联是不是配置了all或merge、remove?
贴出hibernate配置看看
hibernate 多对多双向关联的异常,更新数据时中间表会先执行删除
引用 1 楼 wanghaoloveu 的回复:

自己顶! 弄了一下午了,这个问题一直没解决,不知道怎么回事

user配置
hibernate 多对多双向关联的异常,更新数据时中间表会先执行删除
group配置
hibernate 多对多双向关联的异常,更新数据时中间表会先执行删除
hibernate自动生成了中间表,userid和groupid作为联合主键,groupid外键,这样对吗??
hibernate 多对多双向关联的异常,更新数据时中间表会先执行删除
hibernate 多对多双向关联的异常,更新数据时中间表会先执行删除

hibernate 多对多双向关联的异常,更新数据时中间表会先执行删除
引用 3 楼 zhangjihao 的回复:

级联是不是配置了all或merge、remove?
贴出hibernate配置看看

设置了merge和persist

hibernate 多对多双向关联的异常,更新数据时中间表会先执行删除
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放进去,然后更新操作。

hibernate 多对多双向关联的异常,更新数据时中间表会先执行删除
引用 6 楼 lixiaohua886 的回复:

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的关联吗?

hibernate 多对多双向关联的异常,更新数据时中间表会先执行删除
40分
引用 7 楼 wanghaoloveu 的回复:
Quote: 引用 6 楼 lixiaohua886 的回复:

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肯定不会用的 

hibernate 多对多双向关联的异常,更新数据时中间表会先执行删除
我个人很喜欢Hibernate的实现理论,但是很讨厌在开发中用Hibernate,推荐MyBatis
hibernate 多对多双向关联的异常,更新数据时中间表会先执行删除
引用 8 楼 lixiaohua886 的回复:
Quote: 引用 7 楼 wanghaoloveu 的回复:
Quote: 引用 6 楼 lixiaohua886 的回复:

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肯定不会用的 

hibernate 多对多双向关联的异常,更新数据时中间表会先执行删除
谢谢,已经搞定它现在直接插入了
但是有没有办法不去执行上边那条upadte直接执行insert啊

hibernate 多对多双向关联的异常,更新数据时中间表会先执行删除
这个是怎么搞定的
hibernate 多对多双向关联的异常,更新数据时中间表会先执行删除
这个是怎么搞定的

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明hibernate 多对多双向关联的异常,更新数据时中间表会先执行删除
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!