Если у меня есть репозиторий:
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); ?
Все связано с границами транзакций.
Если ваш метод вызывается вне любой транзакции, базовый 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() {
}
}