gpt4 book ai didi

java - Hibernate 给出 org.hibernate.NonUniqueObjectException 并将过时的对象保存到数据库

转载 作者:行者123 更新时间:2023-12-02 06:05:04 25 4
gpt4 key购买 nike

我的服务类中有以下代码。作为功​​能的一部分,此代码从 2 个不同的方法调用两次。

        //Some code here... 
LOG.info("###Inside customer interceptor");
try
{
customerDao.save(customer);

}
catch (final Exception exp)
{
//some code here too...
}

当第一次从第一个方法调用并执行时,我可以看到tomcat控制台中打印了一条select SQL语句,但没有像我预期的那样更新SQL语句(可能是因为Hibernate没有不要立即发出插入/更新)。立即当从第二种方法再次调用此代码块时,我在 tomcat 控制台中看到一条 SQL select 语句,然后是一条 SQL update 语句,紧接着我看到一个大的 org.hibernate.NonUniqueObjectException。据我所知,这是因为早期的实体仍然附加到 session 并且没有提交到数据库。

但是,当我查看数据库时,我发现数据库中保存的值是第一次调用的对象的值,而不是我预期的第二次调用的对象的值。这是正常现象还是我在这里遗漏了一些东西?

我正在使用 Spring 的注释(@Transactional)驱动的事务策略。

最佳答案

我宁愿使用 .merge(customer) 方法或 .saveOrUpdate(customer) 方法来执行此操作。

  • 如果您使用 .merge,您将不会收到 nonUnique 异常,因为它会用您刚刚传递的对象覆盖 session 中的对象。
  • 在执行 saveOrUpdate 时, session 不应具有您尝试更新的对象的同一实例,否则您会收到此 nonUniqueObject 异常。

因为您使用的是 spring @Transactional,所以应该在执行complete方法之后提交事务。

关于java - Hibernate 给出 org.hibernate.NonUniqueObjectException 并将过时的对象保存到数据库,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22357128/

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