【发布时间】:2014-12-14 11:10:42
【问题描述】:
这些是以下类:
@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,因为没有打开的会话
我知道将 fetch 类型更改为 EAGER 或在 QuestionRepository 中的函数定义上方使用 JPQL 查询可能会解决这个问题,但在我的应用程序中有些部分没有帮助,我需要延迟 fetch。
如何让 getQuestion() 函数中的整个代码使用单个会话/事务,甚至更好地让我的整个请求在单个会话/事务中进行?
【问题讨论】:
-
我认为 Spring 无法在
getQuestion中开始交易,而您只是在使用 Spring Data 的跨链交易。 -
所有
Repository实现默认都是事务性的。当你调用findByName时,spring 开始一个事务,当方法返回时,事务提交并且由于你的会话关闭,list.size()抛出LazyInitializationException。检查播放/弹簧集成..
标签: spring jpa playframework spring-data