java - 如何解决 Spring 数据 rest @RepositoryEventHandler @HandleAfterLinkSave 中的 LazyInitializationException?

标签 java hibernate spring-data-rest eventhandler lazy-initialization

我有一个 spring data rest 应用程序,在 Match 和 Round 类型之间有关系

@Entity
public class Match {

    @OneToMany
    private List<Round> rounds;
    ...
}

当一场比赛和一场比赛之间建立联系时,例如像这样

curl -X PUT -d "http://localhost:8080/rounds/2" -H "Content-Type:text/uri-list" http://localhost:8080/matches/1/rounds;

我用 EventHandler 捕获它以对我的域模型进行一些更新:

public class MatchEventHandler

    @HandleAfterLinkSave
    public void handleLinkSave(Match match, List<Round> rounds) {
        ...
}

我需要访问第二个参数才能进行更新,但是这样做,例如使用 rounds.get(0),返回

org.hibernate.LazyInitializationException: 延迟初始化集合失败,无法初始化代理 - 无 session

阅读其他关于 Hibernates LazyInitializationExceptions 的线程,我主要看到了三种建议的方法:

  1. 使用 Hibernate.initialize() - 我不知道我可以调用哪个方法,它会增加对 Hibernate 框架的丑陋依赖
  2. 将 Controller 方法放入事务中 - 我知道 spring 数据已经将所有内容放入事务中。此外,由于这是一个 spring data rest 应用程序,我没有使用任何 Controller 或服务层,因此我不知道要将什么放入事务中。
  3. 在关系上设置 FetchType.EAGER - 虽然不是真正有效的解决方案,但我确实尝试过。在这种情况下,@HandleAfterLinkSave 方法的第二个参数是一个空列表,因此它也不会提供预期的结果。

最佳答案

属性引用在以下 Spring 类中处理:

org.springframework.data.rest.webmvc.RepositoryPropertyReferenceController

虽然它在大多数情况下都运行良好,但有时还是会出现错误。或者这样说:它有一些有趣的行为......(在过去的两年里我花了几个月的时间来创建一个 improved version of Spring Data Rest )。

如果请求方法是 POST 或 PATCH,那么第二个参数包含更新的集合。但如果您使用 PUT 方法,它包含原始集合。

(此外,如果您的主实体中有多个属性集合,则无法确定修改了哪个集合。 map 类型属性的结果有问题,但那是另一回事了。 )

恕我直言,最好的解决方案是在 RoundRepository 中创建一个存储库方法,并使用它来重新加载集合:

@RestResource(exported = false)
List<Round> findAllByMatch(Match match);

顺便说一句! 关于您的选项 2,请阅读 this topic !

关于java - 如何解决 Spring 数据 rest @RepositoryEventHandler @HandleAfterLinkSave 中的 LazyInitializationException?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56119223/

相关文章:

java - 获得两列的不同组合

hibernate - Spring MVC、Hibernate 3 和@Valid 问题

java - Swagger 未检测到使用 Spring Data Rest 构建的 Api

spring-boot - 在 Spring Data Repositories 的列表中查找包含字符串的实体

java - 为什么不应该扩展 JFrame 和其他组件?

java - 将指示器添加到按钮背景

java - 使用java数组反转数字

java - AbstractUserTypeHibernateIntegrator 用户类型的 Hibernate 空指针

java - JSP:迭代列表并获取每个项目 (ForEach)

java - 如何配置Spring TestRestTemplate