java - 当 Spring/Hibernate JPARepository 返回时,Entties 处于什么生命周期状态?
问题描述
如果我有一个存储库:
public interface ThingRepository extends JpaRepository<Thing, UUID> {
@Query(/* query to get some Things */)
Collection<Thing> getSomeThings(/* some arguments */);
}
哪个由 Spring/Hibernate 自动装配,Thing
返回的实体对象将处于什么状态(持久/分离/瞬态/等)?
上下文 - 如果我们对返回的Thing
(EG thing.setThingString("stuff!")
) 进行更改,是否存在这样的情况:这些更改会在不显式调用的情况下持久化回数据库thingRepository.save(thing);
?
解决方案
简单地看一下 SimpleJpaRepository:
这是将为您的 ThingRepository 实现的具体类的基础。
你会看到:
@Transactional(readOnly = true)
public class SimpleJpaRepository<T, ID> implements JpaRepositoryImplementation<T, ID>
这意味着每个方法都在只读事务中执行,除非像在 save* 方法中那样使用 write Transaction 进行注释:
@Transactional
public <S extends T> S save(S entity)
因此,在您的情况下,实体在您的情况下是只读的。
另请阅读 Spring Data JPA 文档:
https://docs.spring.io/spring-data/jpa/docs/current/reference/html/#transactions
5.7. 交易性
默认情况下,存储库实例上的 CRUD 方法是事务性的。对于读取操作,事务配置 readOnly 标志设置为 true。所有其他人都配置了一个普通的@Transactional,以便应用默认的事务配置。有关详细信息,请参阅 SimpleJpaRepository 的 JavaDoc。如果您需要调整存储库中声明的方法之一的事务配置,请在存储库接口中重新声明该方法