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 静态代码块和spring @value等注解注入顺序
    中秋节
    IP切换
    MMF循环队列实现RPC
    Redis 集群方案
    简单Http多线程下载实现
    信息采集
    大四了
    懒懒交流会《前端,架构,框架与库》里面提到的一些问题
    [知识整理] 导数据工具
  • 原文地址:https://www.cnblogs.com/zgrey/p/14141701.html
Copyright © 2011-2022 走看看