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

标签 java spring hibernate spring-transactions

我的服务类中有以下代码。作为功​​能的一部分,此代码从 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/

相关文章:

java - 查找后无法使用数据源

java - Spring 批处理问题 : "Problems occurred while synchronizing remote to local directory"

java - 嵌入式 h2 数据库未运行

java - 将 UUID 添加到 neo4j spring 数据框架

具有即插即用数据库的 Java 应用程序

java - 在 hibernate 查询的连接中返回的对象类型是什么

java - 简单java程序的运行时错误nullpointerException

java - 以一定角度在 Canvas 上绘制文本

Java - 从另一个类输入字符串时出现 MalformedURLException,但在粘贴相同的字符串时不会出现异常

sql - 我们是否应该将单向的一对多关系分解为 JoinTable