我正在使用Spring和Hibernate。我正在这样运行jUnit测试:
String number = invoiceNumberService.nextInvoiceNumber();
并且invoiceNumberService方法是:
InvoiceNumber invoiceNumber = invoiceNumberRepository.findOne(1L);
使用简单的Spring Data Repository方法,它正常运作。但当我重写这个方法来使用锁定时:
@Lock(LockModeType.PESSIMISTIC_READ)
@Override
InvoiceNumber findOne(Long id);
我遇到了"javax.persistence.OptimisticLockException: Row was updated or deleted by another transaction"错误。
我无法理解为什么会出现乐观锁异常,因为我正在使用悲观锁定?还有,在哪里发生了另一个事务更改此实体的情况?我已经查找了很多类似的问题,但仍然感到绝望。谢谢任何帮助。
解决方案:
问题出在我的测试类的init函数中:
@Before
public void init() {
InvoiceNumber invoiceNumber = new InvoiceNumber(1);
em.persist(invoiceNumber);
em.flush();
}
缺乏了
em.flush();
将数据保存到数据库中,这样findOne()函数现在就可以检索到它了。