• 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表,缓存。

  • 相关阅读:
    Linux常用命令
    Linux常用命令
    Linux常用命令
    Linux 三剑客
    Python思维导图(二)—— 数据类型
    Python思维导图(一)—— 基础
    testNg
    Linux安装Git
    本地Git绑定Github仓库
    TCP协议与UDP协议
  • 原文地址:https://www.cnblogs.com/zgrey/p/14141701.html
Copyright © 2020-2023  润新知