【发布时间】:2014-12-08 11:16:54
【问题描述】:
我正在使用 Spring 和 Hibernate。我正在像这样运行 jUnit 测试:
String number = invoiceNumberService.nextInvoiceNumber();
invoiceNumberService 方法是:
InvoiceNumber invoiceNumber = invoiceNumberRepository.findOne(1L);
它使用简单的spring数据存储库方法,并且运行良好。但是当我重写此方法以使用锁定时:
@Lock(LockModeType.PESSIMISTIC_READ)
@Override
InvoiceNumber findOne(Long id);
我收到“javax.persistence.OptimisticLockException:行已被另一个事务更新或删除”
我不明白为什么它的乐观锁异常,而我正在使用悲观锁?当另一个交易改变这个实体时,这部分在哪里?
我已经挖掘了很多类似的问题,对此我感到非常绝望。谢谢你的帮助
解决方案:
问题出在我在测试类中的初始化函数中:
@Before
public void init() {
InvoiceNumber invoiceNumber = new InvoiceNumber(1);
em.persist(invoiceNumber);
em.flush();
}
缺少了
em.flush();
这会将数据保存到数据库中,因此 findOne() 现在可以检索它
【问题讨论】:
-
我遇到了同样的问题和同样的解决方案。对我来说,Hibernate 不会自行刷新,这听起来像是一个错误。
标签: java spring hibernate jakarta-ee