Код: Выделить всё
Hibernate OptimisticLockException in Java 21 – works fine in Java 17Недавно я обновил свой проект с Java 17 → Java 21, и один из моих тестовых примеров Hibernate начал завершаться с ошибкой:
Код: Выделить всё
jakarta.persistence.OptimisticLockException: Row was updated or deleted by another transaction
(or unsaved-value mapping was incorrect)
Код: Выделить всё
@Test
void shouldRemoveFeature() {
ComplianceScraper scraper = ComplianceScraper.forSite("2features.com")
.withFeature(ComplianceFeature.forXpath("//price").build())
.build();
inTx.runC(scraper, dao::save);
inTx.runBC(scraper, scraper.getComplianceFeature(), dao::removeFeature);
scraper = inTx.run("2features.com", dao::fetchBySite).orElseThrow(RuntimeException::new);
assertNull(scraper.getComplianceFeature());
}
Код: Выделить всё
public void removeFeature(ComplianceScraper scraper, ComplianceFeature feature) {
scraper = getById(scraper.getId());
scraper.removeFeature(feature); // orphanRemoval = true
}
Чтобы исправить это, я добавил эти две строки:
Код: Выделить всё
public void removeFeature(ComplianceScraper scraper, ComplianceFeature feature) {
scraper = getById(scraper.getId());
scraper.removeFeature(feature);
em.flush();
em.clear();
}
Мои вопросы:
- Почему этот код работал нормально в Java 17, но не работал в Java 21?
- Что именно происходит за сцены с em.flush() и em.clear()?
- Правильно ли добавление этих строк или есть лучший способ справиться с этим в Hibernate 6/Java 21?
- Версия Java: 21
- Спящий режим: 6.6.31.Final
- Поставщик JPA: Jakarta Persistence
- База данных: H2 (для тест)
- Flyway: обновлен до последней версии
Подробнее здесь: https://stackoverflow.com/questions/798 ... in-java-17
Мобильная версия