我在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'异常。
这是因为当使用@ManyToMany
时,首先获取用户的所有Project
s,然后获取User
s的所有Project
s等等......这种循环依赖性导致错误,因为在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<>();
虽然我不推荐这种解决方案,因为性能问题(以及可能的副作用)。更好的解决方案是拥有一个连接表实体。
尝试使用@Transactional也许可以解决它,因为getFavorites()方法上的@Transactional注释表明会话将在此方法结束时关闭