gpt4 book ai didi

java - Hibernate:具有相同标识符值的不同对象已经与 session 相关联

转载 作者:太空狗 更新时间:2023-10-29 22:51:20 24 4
gpt4 key购买 nike

<分区>

Possible Duplicate:
Hibernate Error: org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session

当我使用 DAO.update(userbean) 时,session.SaveOrUpdate(e);抛出异常:具有相同标识符值的不同对象已与 session 关联

函数如下:

    public E save(E e) {
Session session = null;
try {
session = sessionFactory.openSession();
log.debug("session="+session.hashCode()+" save "+e);
session.SaveOrUpdate(e); //here throws exception
session.flush();
}
catch (Exception e1) {
log.err("Cannot open hibernate session "+ e1.getMessage()+" cause : "+e1.getCause());
e1.printStackTrace();
}
finally { if ( session != null ) session.close(); session = null;}
return e ;
}

userbean 是类 UserBean 的一个实例

public class UserBean{
private List<GroupBean> groups = new ArrayList<GroupBean> ();
private List<RoleBean> roles = new ArrayList<RoleBean> ();
}

public class GroupBean{
private List<RoleBean> roles = new ArrayList<RoleBean> ();
}

每个 groupbean 都有一个角色列表,这些角色不会更改。

在数据库中,组和角色是多对多的映射,

例如,

我们有一个 groupbean#1,它是角色:rolebean#1,rolebean#2;

groupbean#2,哪些角色是rolebean#1。

现在我创建一个新的 userbean#1,它的组是 groupbean#1如果我想将 rolebean#1 添加到 userbean#1,它会像标题描述那样抛出异常

我查看server.log,发现当我使用DAO.save时,saveOrUpdate命令是:

userbean#1
|---|-----------***userbean.groups
| | groupbean#1
| | groupbean.roles
| | rolebean#1 # save relebean#1 the first time
| | ---done rolebean#1
| | ------done all rolebeans of group.roles
| | ---done groupbean#1
| |-----------done all groupbeans of userbean.groups
|---|-----------***userbean.roles
| rolebean#1 # save rolebean#1 the second time, and throws exception here!
| ----done rolebean#1
| .....
|-----------done all rolebeans of userbean.roles

异常的原因是rolebean#1在一个session中被保存了两次,而且他们的身份是一样的。

在函数save(E e)中,如果我使用

session.merge(e);

替换

session.SaveOrUpdate(e);

不会抛出异常,但是 rolebean#1 没有关联到 userbean#1

有人可以就此提出一些建议吗?

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com