以下是相关的类:
在控制器文件中,我有以下文件:
@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);
}
在控制器文件中,我有以下文件:
@Transactional
public Result getQuestion() {
List<Choices> list = this.questionRepository.findByName("name").choices;
list.size();
return ok();
}
在getQuestion()中,list.size()会抛出LazyInitializationException异常,因为没有打开会话。
我知道将获取类型更改为EAGER或在QuestionRepository中的函数定义上方使用JPQL查询可能会解决此问题,但是我的应用程序的某些部分无法帮助我并且我需要进行延迟获取。
如何使getQuestion()函数中的整个代码使用单个会话/事务,甚至更好的是,使我的整个请求在一个会话/事务中进行?
getQuestion
中开始一个事务,你只是使用了Spring Data的内部事务。 - Ali DehghaniRepository
实现默认都是事务性的。当你调用findByName
方法时,Spring 会开始一个事务,当方法返回时,事务会提交并且由于会话已关闭,list.size()
抛出LazyInitializationException
异常。请检查 Play/Spring 集成。 - Ali Dehghani