Я искал ответы в Интернете в течение 2 дней и подумал, что пора опубликовать вопрос.
У меня есть веб-сервис Spring Boot, который развернут во встроенном tomcat и JBoss EAP. В JBoss он использует JBossAppServerJtaPlatform, а в tomcat - Spring Transactions. Когда я пытаюсь сохранить объект, я получаю - OptimisticLockException - Строка была обновлена или удалена другой транзакцией (или отображение несохраненных значений было неверным) ... Вызвано: org.hibernate.StaleObjectStateException:
Это ошибка возникает только во встроенном tomcat, а не в JBoss EAP. Я понимаю, почему возникает ошибка, потому что для спящего режима объект все еще управляется, и простое увеличение версии не приведет к созданию новой строки в БД. В конце я надеюсь, что в БД будет две строки. Вот что происходит на платформе JBoss.
Я использую Spring Data - 2.1.10.RELEASE / Hibernate - 5.3.10.Финальные версии.
Вот пример кода.
public class EntityDomain implements Serializable {
@Id
@Column(name = "name")
private String name;
@Id
@Column(name = "name")
private Integer version;
..other properties
public boolean equals(Object o) {}
public int hashCode() {}
}
@RestController
@RequestMapping(value = "/path", produces = MediaType.APPLICATION_JSON)
public class EntityController {
public EntityDomain updateDomain() {
EntityDomain entityDomain = entityDao.findByName(entityDomain.getName());
entityDomain.setName(entityDomain.getName());
entityDomain.setVersion(entityDomain.getVersion() + 1);
//This is where the OptimisticLockException
entityDomain = entityDao.create(latestBulletinDomain);
return entityDomain;
}
}
@Transactional
public class GenericCrudDaoImpl<T, K> implements GenericCrudDao<T> {
@PersistenceContext
protected EntityManager entityManager;
@Override
public T create(T item) {
entityManager.persist(item);
entityManager.flush();
return item;
}
}