Hibernate ManyToMany方法引发了“ org.hibernate.LazyInitializationException”异常

时间:2019-02-25 20:00:46

标签: java hibernate spring-boot many-to-many lazy-initialization

我在Hibernate中有ManyToMany关系

Project.class

@ManyToMany
@JoinTable(
        name = "user_projects",
        joinColumns = { @JoinColumn(name = "project_id")},
        inverseJoinColumns = { @JoinColumn(name = "user_id")}
)
private Set<User> projectUsers = new HashSet<>();

User.class

@ManyToMany(fetch = FetchType.EAGER, 
            mappedBy="projectUsers",
            cascade = CascadeType.ALL)
private Set<Project> userProjects = new HashSet<>();

当我通过

获得当前用户时
@AuthenticationPrincipal User user

当user.getUserProjects();时,我的方法抛出了“ org.hibernate.LazyInitializationException”异常。

2 个答案:

答案 0 :(得分:1)

这是因为在使用@ManyToMany时,首先要获取所有Project个用户,然后要获取所有UserProject,依此类推...如此循环依赖关系会导致错误,因为Project端急切缺少获取。

解决方案是使用:

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
        name = "user_projects",
        joinColumns = { @JoinColumn(name = "project_id")},
        inverseJoinColumns = { @JoinColumn(name = "user_id")}
)
private Set<User> projectUsers = new HashSet<>();

尽管由于性能问题(以及可能的副作用),我不建议使用此解决方案。更好的解决方案是为连接表提供一个实体。

答案 1 :(得分:0)

尝试使用@Transactional也许可以解决它,因为 getFavorites()方法上的@Transactional批注指示该方法结束时会话将关闭