Hibernate ManyToMany方法抛出'org.hibernate.LazyInitializationException'异常

问题描述 投票:0回答:2

我在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'异常。

java hibernate spring-boot many-to-many lazy-initialization
2个回答
1
投票

这是因为当使用@ManyToMany时,首先获取用户的所有Projects,然后获取Users的所有Projects等等......这种循环依赖性导致错误,因为在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<>();

虽然我不推荐这种解决方案,因为性能问题(以及可能的副作用)。更好的解决方案是拥有一个连接表实体。


0
投票

尝试使用@Transactional也许可以解决它,因为getFavorites()方法上的@Transactional注释表明会话将在此方法结束时关闭

© www.soinside.com 2019 - 2024. All rights reserved.