spring Data Jpa 报错 failed to lazily initialize a collection of role: com.itheim.pojo.Role.users, could not initialize proxy - no Session
初始环境:hibernate 每个用户对应一个小组 。user--group(many to one)。group--user(one to many)
Group代码片段
@OneToMany(mappedBy="group" )
@JoinColumn(name="groupid")
public Set<User> getUsers() {
return users;
}User代码片段
@ManyToOne
@JoinColumn(name="groupid")
public Group getGroup() {
return group;
}
在执行这段代码时
@Test
public void testGetGroup(){
//testSaveGroup();
Session se=sf.getCurrentSession();
se.beginTransaction();
Group g=(Group)se.get(Group.class, 1);
se.getTransaction().commit();
for(User u : g.getUsers()){
//g.getUsers()
System.out.println("------------------");
System.out.println(u.getName());
}
}
会出现异常:
- 也就是懒加载异常
这是因为Hibernate Annotation的默认的FetchType在ManyToOne是EAGER的,在OneToMany上默认的是LAZY.
就是说这段代码中,User是FetchType.EAGER。 而Group是FetchType.LAZY。
执行
Group g=(Group)se.get(Group.class, 1);
查询到的结果是
select group0_.id as id1_0_, group0_.name as name1_0_ from t_group group0_ where group0_.id=?
只有group表的数据。
而要执行
for(User u : g.getUsers()){
还需要连接数据库,但是session已经提交关闭了。所以会报 failed to lazily initialize a collection of role 异常。
要解决这个问题
1.可以在Group中设置FetchType.EAGER,得到对应的User表,缓存。