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

  • 相关阅读:
    腾讯蓝鲸cmdb部署
    Linux 检测 tls
    MongoDB主从
    rundeck配置salt-api
    salt-api 配置使用
    rsync同步备份
    su与su -,sudo 的区别
    Redis 迁移 DB; move key db
    数据结构与算法面试题80道(36)
    数据结构与算法面试题80道(35)
  • 原文地址:https://www.cnblogs.com/zgrey/p/14141701.html
Copyright © 2011-2022 走看看