Tôi đang sử dụng Spring with Hibernate. Tôi đang chạy thử nghiệm JUnit như thế này:OptimisticLockException trong khóa bi quan
String number = invoiceNumberService.nextInvoiceNumber();
và invoiceNumberService phương pháp là:
InvoiceNumber invoiceNumber = invoiceNumberRepository.findOne(1L);
nó được sử dụng phương pháp kho dữ liệu mùa xuân đơn giản, và nó hoạt động tốt. Nhưng khi tôi ghi đè phương pháp này để sử dụng khóa:
@Lock(LockModeType.PESSIMISTIC_READ)
@Override
InvoiceNumber findOne(Long id);
Tôi nhận được "javax.persistence.OptimisticLockException: Row đã được cập nhật hoặc bị xóa bởi một giao dịch"
Tôi không thể hiểu tại sao khóa ngoại lệ lạc quan của nó , trong khi tôi đang sử dụng khóa bi quan? Và đâu là phần này khi một giao dịch khác đang thay đổi thực thể này? Tôi đã đào rất nhiều câu hỏi tương tự và tôi khá tuyệt vọng về điều này. Nhờ sự giúp đỡ
Giải pháp:
Vấn đề là trong hàm init của tôi trong lớp thử nghiệm:
@Before
public void init() {
InvoiceNumber invoiceNumber = new InvoiceNumber(1);
em.persist(invoiceNumber);
em.flush();
}
Có thiếu
em.flush();
nào tiết kiệm dữ liệu vào cơ sở dữ liệu , do đó findOne() hiện có thể truy xuất nó
Tôi đã gặp sự cố tương tự và cùng một giải pháp. Âm thanh như một lỗi với tôi rằng Hibernate không tuôn ra bởi chính nó. – gnomie