spring Data Jpa 报错 failed to lazily initialize a collection of role: com.itheim.pojo.Role.users, could not initialize proxy

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());
		}
	}

会出现异常:

image-20201215222054472

  • 也就是懒加载异常

这是因为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表,缓存。

原文地址:https://www.cnblogs.com/zgrey/p/14141701.html