spring - Play Framework + Spring Data JPA : LazyInitializationException

标签 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<Choice> choices = new ArrayList<>();
}

@Named
@Singleton
public interface QuestionRepository extends CrudRepository<Question , Long> {
    Question findByName(String name);
}

在 Controller 文件中我有以下文件

@Transactional
public Result getQuestion() {
    List<Choices> list = this.questionRepository.findByName("name").choices;
    list.size();
    return ok();
}

getQuestion() 中的 list.size() 抛出一个 LazyInitializationException,因为没有打开的 session

我知道将获取类型更改为 EAGER 或在 QuestionRepository 中的函数定义上方使用 JPQL 查询可能会解决此问题,但我的应用程序中的某些部分无济于事,我需要延迟获取。

如何使 getQuestion() 函数中的整个代码使用单个 session /事务,甚至更好地使我的整个请求发生在单个 session /事务中?

最佳答案

来自 Spring Data JPA reference documentation

4.7.1. Transactional query methods

To allow your query methods to be transactional simply use @Transactional at the repository interface you define.

Example 100. Using @Transactional at query methods

@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();
}

Typically you will want the readOnly flag set to true as most of the query methods will only read data. In contrast to that deleteInactiveUsers() makes use of the @Modifying annotation and overrides the transaction configuration. Thus the method will be executed with readOnly flag set to false.

因此只需将@Transactional 注释添加到您的存储库接口(interface)即可。

关于spring - Play Framework + Spring Data JPA : LazyInitializationException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27468713/

相关文章:

java - Spring 的多线程

java - 如何在 JmsMessagingTemplate.sendAndReceive 上设置等待超时

java - 如何在 JPA 中对集合属性进行动态排序?

jpa - 如何从 JPA 获取分离对象

database - DdlGenerator 构造函数不需要参数?

java - Play Framework 1.2.6 连接多个数据库

java - Spring BeanNotOfRequiredTypeException

java - Spring,在应用程序启动期间复制文件

java - JPA CriteriaBuilder 连接条件转换为分离条件

mysql - ebean 生成不兼容 mysql 的演化