播放框架+;Spring数据JPA:LazyInitializationException

播放框架+;Spring数据JPA:LazyInitializationException,spring,jpa,playframework,spring-data,Spring,Jpa,Playframework,Spring Data,这些是以下类别: @Entity public class Question { @Id public Long id; public String name; @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST) @JoinColumn(name = "OWNER_ID", referencedColumnName = "QUES_ID") public List<Choi

这些是以下类别:

@Entity
public class Question {
   @Id
   public Long id;
   public String name;

   @OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.PERSIST)
   @JoinColumn(name = "OWNER_ID", referencedColumnName = "QUES_ID")
   public List<Choice> choices = new ArrayList<>();
}

@Named
@Singleton
public interface QuestionRepository extends CrudRepository<Question , Long> {
    Question findByName(String name);
}
@实体
公开课问题{
@身份证
公共长id;
公共字符串名称;
@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.PERSIST)
@JoinColumn(name=“OWNER\u ID”,referencedColumnName=“QUES\u ID”)
公共列表选项=新建ArrayList();
}
@命名
@独生子女
公共接口问题库扩展了Crudepository{
问题findByName(字符串名称);
}
在控制器文件中,我有以下文件

@Transactional
public Result getQuestion() {
    List<Choices> list = this.questionRepository.findByName("name").choices;
    list.size();
    return ok();
}
@Transactional
公共结果问题(){
List List=this.questionRepository.findByName(“名称”).choices;
list.size();
返回ok();
}
getQuestion()中的list.size()引发LazyInitializationException,因为没有打开的会话

我知道,将fetch类型更改为EAGER或在QuestionRepository中的函数定义上方使用JPQL查询可能会解决这个问题,但在我的应用程序中,有一部分没有帮助,我需要延迟fetch

如何使getQuestion()函数中的整个代码使用单个会话/事务,或者更好地使我的整个请求在单个会话/事务中进行?

From

4.7.1. 事务查询方法 要使查询方法具有事务性,只需在存储库界面使用
@transactional
你定义

例100。在查询方法中使用@Transactional

@Transactional(readOnly=true)
公共接口用户存储库扩展了JpaRepository{
列出findByLastname(字符串lastname);
@修改
@交易的
@查询(“从用户u删除,其中u.active=false”)
void deleteInactiveUsers();
}
通常,您需要将
readOnly
标志设置为
true
,因为大多数查询方法只读取数据。与此相反,
deleteInactiveUsers()
使用
@修改
注释并覆盖事务配置。因此,该方法将在
readOnly
标志设置为
false
的情况下执行


所以只需将@Transactional注释添加到您的存储库界面。

我认为spring无法在
getQuestion
中开始事务,您只是在使用spring数据的intertanl事务。默认情况下,所有
repository
实现都是事务性的。当您调用
findByName
时,spring开始一个transactions,当方法返回时,事务提交,并且由于会话关闭,
list.size()
抛出
LazyInitializationException
。选中play/spring integration..您可以参考前面提到的关于我想要一个不带@Query的解决方案,一个使会话/事务在UserRepository之外可用的解决方案。不需要查询,只需将事务添加到接口。添加事务功能有效,getQuestion是我的控制器类的成员,而不是存储库接口。检查事务的传播,基本上您希望存储库和方法上的事务具有所需的传播。实际需要的是默认配置。检查您是否在Spring配置中启用了事务(@EnableTransactionManagement或存在)?在这两个地方只保留@Transaction。
@Transactional(readOnly = true)
public interface UserRepository extends JpaRepository<User, Long> {

    List<User> findByLastname(String lastname);

    @Modifying 
    @Transactional
    @Query("delete from User u where u.active = false")  
    void deleteInactiveUsers();
}