OptimisticLockException - StaleObjectStateException - только при работе в веб-контейнере apache - PullRequest
0 голосов
/ 07 мая 2020

Я искал ответы в Интернете в течение 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;
    }
}
...