spring-data-jpa多对多双向映射,查询进入死循环
两个实体类
User
@Data
@Entity
@Table(name = "sys_user")
public class User {
@Id
@GeneratedValue
@Column(name = "user_id")
private Integer userId;
@Column(name = "username")
private String username;
@ManyToMany(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY)
@JoinTable(
name = "user_role",
joinColumns = {@JoinColumn(name = "user_id")},
inverseJoinColumns = {@JoinColumn(name = "role_id")}
)
private Set<Role> roles;
}
Role
@Data
@Entity
@Table(name = "sys_role")
public class Role {
@Id
@Column(name = "role_id")
private Integer roleId;
@Column(name = "role_name", unique = true)
private String roleName;
@ManyToMany(cascade = {CascadeType.ALL}, fetch = FetchType.LAZY, mappedBy = "roles")
private Set<User> users;
测试代码
@Transactional
@Test
public void save() throws Exception{
Set<Role>roles = new HashSet<Role>();
roles.add(new Role(1, "USER"));
roles.add(new Role(2, "ADMIN"));
repository.save(new User("张三", roles));
}
@Transactional
@Test
public void findAll(){
List<User> users = repository.findAll();
for (User user : users) {
System.out.println(user);
}
}
在使用插入数据的时候没有任何问题,但是当查询的时候报错
org.hibernate.LazyInitializationException: failed to lazily initialize a collection of role: wang.xiaoqiang.manytomany.entity.User.roles, could not initialize proxy - no Session
这个可以理解,懒加载的时候丢失了session无法获取roles信息,当将user中的集合设置为急加载模式fetch = FetchType.LAZY
,结果就遇到StackOverflowError
。
哪位大佬有相关经历,帮帮忙。。。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
之前用JUnit进行单元测试的时候遇到过类似的问题
可以尝试在单元测试类上添加
@TestExecutionListeners
注解,并传入一个数组,数组中包含TransactionalTestExecutionListener.class
User类里加上@JsonIgnoreProperties(value = { "users" }),Role类里加上@JsonIgnoreProperties(value = { "roles" }),在循环的时候过滤某个字段,在自己的实体里过滤自己,就不会查到第二遍了