首页 > 解决方案 > 当 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);

标签: javaspringhibernatejpaspring-data-jpa

解决方案


简单地看一下 SimpleJpaRepository:

https://github.com/spring-projects/spring-data-jpa/blob/master/src/main/java/org/springframework/data/jpa/repository/support/SimpleJpaRepository.java

这是将为您的 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。如果您需要调整存储库中声明的方法之一的事务配置,请在存储库接口中重新声明该方法


推荐阅读