Какое состояние жизненного цикла есть Entties, когда возвращается Spring / Hibernate JPARepository?

Если у меня есть репозиторий:

public interface ThingRepository extends JpaRepository<Thing, UUID> {
  @Query(/* query to get some Things */)
  Collection<Thing> getSomeThings(/* some arguments */);
}

, который является автономным с помощью Spring / Hibernate, в каком состоянии будут возвращаться объекты объекта Thing, которые возвращаются (постоянный / отсоединенный / переходный / etc )?

Контекст - если мы вносим изменения в возвращаемый Thing (EG thing.setThingString("stuff!")), существует ли когда-либо ситуация, когда эти изменения будут сохраняться обратно в базу данных без явного вызова thingRepository.save(thing); ?

1
задан 13 August 2018 в 14:13

1 ответ

Все связано с границами транзакций.

Если ваш метод вызывается вне любой транзакции, базовый entityManager уже закрыт, а возвращаемые объекты будут отсоединены.

Если ваш метод вызывается внутри существующей транзакции, тогда entityManager все еще открыт, а возвращаемые объекты находятся в управляемом состоянии. Обратите внимание, что в этом случае, если транзакция отмечена как readOnly, entityManager никогда не будет очищен, и никакие изменения не будут сохранены, даже если сущности будут управляться.

Обратите также внимание, что флаг readOnly не переопределяется внутренней логической транзакцией свойства (в отличие от rollbackFor)

public class A {
    @Transactional(propagation = Propagation.REQUIRED)
    public void performA() {
        // b transaction scope is not read only, but TransactionManager will rollback for checkedException thrown from here
        b.performB(); 
    }
}

public class B {
    @Transactional(readOnly = true, propagation = Propagation.REQUIRED, rollbackFor = CheckedException.class)
    public void performB() {

    }
}
0
ответ дан 15 August 2018 в 17:03

Другие вопросы по тегам:

Похожие вопросы: