zoukankan      html  css  js  c++  java
  • 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表,缓存。

  • 相关阅读:
    [编程语言][java][java se]java泛型中? T K V E含义(学习)
    Effective C++ 第二版 10) 写operator delete
    Cocos2d-x C++调用Android弹出提示框
    面试宝典 问题记录
    送给初入大学的工科男们一篇童话
    二叉树遍历
    webservice的讲解
    在JNI中新开线程遇到问题
    jni调试3(线程调试env变量问题)
    eMMC(KLM8G2FE3B)
  • 原文地址:https://www.cnblogs.com/zgrey/p/14141701.html
Copyright © 2011-2022 走看看