【发布时间】:2012-11-15 07:54:49
【问题描述】:
我用一个例子来提出这个问题。
断言我们有一个如下所示的存储库:
public interface ExampleObjectRepository extends CrudRepository<ExampleObject, Long> {
}
通过扩展JpaRepository接口,ExampleObject存储库继承如下方法:
T findOne(ID id);
现在,我观察到,如果在调用此方法后收到对 ExampleObject 的引用,我对该方法所做的任何操作都会自动保存到数据库中,例如:
ExampleObject pointInCase = exampleObjectRepository.findOne(1L);
pointInCase.setName("Something else");
阅读该主题后,我明白这意味着ExampleObject 实例是not detached。
这出乎我的意料。我原以为我需要使用从CrudRepository 继承的保存方法来保存更改:
T save(T entity);
是否有人愿意确认从 Spring Data JPA 存储库返回的对象仍然作为标准附加,并解释如何使用 API 标记存储库中的方法,使其仅返回分离的引用?
我想改变实体的状态也可能改变它的定义,当它与上述save(T entity) 方法一起使用时,所以我也希望了解如何处理更新的身份。
【问题讨论】:
-
也许这是旧版本 Spring Data JPA 中的一种行为,在最近的版本中,CrudRepository 的默认实现中的所有读取操作都用 @Transactional(readOnly = true) 注释,这使得它们分离,你需要做 repository.save 以保持更改
标签: spring jpa spring-data-jpa