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