hibernate错误:具有相同标识符值的不同对象已与会话关联

khbbv19g  于 2021-07-06  发布在  Java
关注(0)|答案(21)|浏览(556)

我基本上在这个配置中有一些对象(实际的数据模型有点复杂):
a与b之间存在多对多关系(b有 inverse="true" )
b与c之间存在多对一关系(我有 cascade 设置为 "save-update" )
c是一种类型/类别表。
另外,我应该提到,主键是由数据库在保存时生成的。
对于我的数据,我有时会遇到这样的问题:a有一组不同的b对象,而这些b对象引用同一个c对象。
当我打电话的时候 session.saveOrUpdate(myAObject) ,我得到一个hibernate错误: "a different object with the same identifier value was already associated with the session: C" . 我知道hibernate不能在同一个会话中插入/更新/删除同一个对象两次,但是有什么方法可以解决这个问题吗?这种情况似乎并不少见。
在我研究这个问题的过程中,我看到有人建议使用 session.merge() ,但当我这样做时,任何“冲突”对象都会作为空对象插入到数据库中,所有值都设置为null。显然这不是我们想要的。
[编辑]另一件我忘记提到的事情是(由于我无法控制的体系结构原因),每次读写都需要在单独的会话中完成。

h9a6wy2h

h9a6wy2h16#

只需提交当前事务。

currentSession.getTransaction().commit();

现在您可以开始另一个事务并在实体上执行任何操作

pwuypxnk

pwuypxnk17#

我有这个错误几天去,我加快了太多的时间来修复这个错误。

public boolean save(OrderHeader header) {
    Session session = sessionFactory.openSession();

    Transaction transaction = session.beginTransaction();

    try {
        session.save(header);

        for (OrderDetail detail : header.getDetails()) {
            session.save(detail);
        }

        transaction.commit();
        session.close();

        return true;
    } catch (HibernateException exception) {

        exception.printStackTrace();
        transaction.rollback();
        return false;
    }
}

在我得到这个错误之前,我没有提到orderdetil对象的id生成类型。如果不生成orderdetails的id,它会将每个orderdetail对象的id保持为0。这就是jbx所解释的。是的,这是最好的答案。这是它如何发生的一个例子。

wwwo4jvm

wwwo4jvm18#

使用以下命令将对象id从hibernate分配到数据库:

<generator class="native"/>

这为我解决了问题。

ia2d9nvy

ia2d9nvy19#

解决上述问题的一种方法是重写 hashcode() .
同时在保存之前和之后刷新休眠会话。

getHibernateTemplate().flush();

将分离的对象显式设置为 null 也有帮助。

xriantvc

xriantvc20#

如果使用entityrepository,则使用saveandflush而不是save

v09wglhw

v09wglhw21#

尝试将查询的代码放在前面。解决了我的问题。e、 g.更改此项:

query1 
query2 - get the error 
update

对此:

query2
query1
update

相关问题