【发布时间】:2018-08-25 10:03:15
【问题描述】:
我有一个用例,它调用以下内容:
@Override
@Transactional(propagation=Propagation.REQUIRES_NEW)
public UserControl getUserControlById(Integer id){
return this.userControlRepository.getOne(id);
}
注意@Transactional 有 Propagation.REQUIRES_NEW 并且存储库使用 getOne。当我运行该应用程序时,我收到以下错误消息:
Exception in thread "main" org.hibernate.LazyInitializationException:
could not initialize proxy - no Session
...
但如果我将getOne(id) 更改为findOne(id) 一切正常。
顺便说一句,就在用例调用 getUserControlById 方法之前,它已经调用了 insertUserControl 方法
@Override
@Transactional(propagation=Propagation.REQUIRES_NEW)
public UserControl insertUserControl(UserControl userControl) {
return this.userControlRepository.save(userControl);
}
这两种方法都是Propagation.REQUIRES_NEW,因为我正在做一个简单的审计控制。
我使用getOne 方法,因为它是在JpaRepository 接口中定义的,并且我的Repository 接口从那里扩展,当然我正在使用JPA。
JpaRepository 接口扩展自CrudRepository。
findOne(id) 方法在 CrudRepository 中定义。
我的问题是:
- 为什么
getOne(id)方法会失败? - 什么时候应该使用
getOne(id)方法?
我正在使用其他存储库,并且都使用 getOne(id) 方法并且一切正常,只有当我使用 Propagation.REQUIRES_NEW 时它才会失败。
根据 getOne API:
返回对具有给定标识符的实体的引用。
根据 findOne API:
通过 id 检索实体。
-
什么时候应该使用
findOne(id)方法? -
推荐使用什么方法?
【问题讨论】:
-
您尤其不应该使用 getOne() 来测试数据库中是否存在对象,因为使用 getOne 您总是得到一个对象 != null,而 findOne 提供的是 null。
标签: jpa spring-data spring-data-jpa