Позвоните, чтобы обновить базу данных без таргетинга - PullRequest
0 голосов
/ 23 марта 2019

Метод (в состоянии без состояния) ищет объект на основе его идентификатора.Этот метод вызывает другой метод (в другом состоянии без состояния) в новой транзакции.Этот новый метод ищет объект на основе его идентификатора и модифицирует этот объект.Первый метод обновляет объект, который вызывает ошибку.

Я использую 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.
...