我在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”异常。
答案 0 :(得分:1)
这是因为在使用@ManyToMany
时,首先要获取所有Project
个用户,然后要获取所有User
个Project
,依此类推...如此循环依赖关系会导致错误,因为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批注指示该方法结束时会话将关闭