Метод (в состоянии без состояния) ищет объект на основе его идентификатора.Этот метод вызывает другой метод (в другом состоянии без состояния) в новой транзакции.Этот новый метод ищет объект на основе его идентификатора и модифицирует этот объект.Первый метод обновляет объект, который вызывает ошибку.
Я использую Java EE 7 и Hibernate в качестве реализации.
Код:
@Stateless
public class A {
@Inject
B b;
public update(Long id) {
Person p = findById(id);
b.setExecute(p.getId());
em.refresh(p);
p.setFirstname("john.doe");
}
}
@Stateless
public class B {
@TransactionAttribute(TransactionAttributeType.REQUIRES_NEW)
public void setExecute(Long personId) {
Person p = em.find(Person.class, personId);
p.setInExecution(true);
p.setState(PersonState.MODIFIED);
}
}
Ошибка связана ск факту, что метод setExecute
обновляет объект в новой транзакции и увеличивает версию объекта, однако вызов метода refresh не возвращает значения из базы данных, что вызывает:
org.hibernate.StaleStateException:
Batch update returned unexpected row count from update.