JPA多对多映射关系Hibernate懒加载错误解决

问题描述:

在用户和角色关联的时候,比如用户(a)关联了两个角色(i和ii),那么在根据id查用户的时候,去看User实体里的roles角色Set集合,里面会报错:Unable to evaluate the expression Method threw ‘org.hibernate.LazyInitializationException’ exception.

解决方案:

加上 @Transactional注解

原因分析:

Hibernate延迟加载策略, 也就是用到的时候才去加载.这样可以提高一些性能.
Hibernate的lazy loading 采用了一个HibernateSession来管理session,它的逻辑是每进行一次数据库操作,就开新的session,操作完成后立即关闭该session。这样做的好处是可以严格关闭session,避免菜鸟级的错误,但是并不推荐这么做。因为这不适合lazy loading,也不适合跨方法的事务。
比如在我们的应用中,user->article 形成一对多的映射,User 中有一个包含 article 的List。
在User中,有多个属性:name,password,phone等,还有一个 List 类型的 articleList。当我们对 article 使用 lazy laoding 的时候,hibernate会在获得 User 对象的时候,仅仅返回 name,password,phone 等基本属性,当你访问 articleList 的时候,它才会从数据库中提取 articleList 需要的数据,这就是所谓lazy laoding。但是在我们的系统中,session是被立即关闭的,也就是在读取了name,password,phone等基本属性后,session 已经 close了,再进行 lazy loaiding 就会有异常。

										——[斜体出自博文](https://liuyanzhao.com/6995.html)
    /**
     * jpa的多对多关系分为维护端和被维护端,删除维护端的记录会影响关联表中的记录
     * 但是删除被维护端的记录不会影响关联表中的记录
     */
    @Test
    @Transactional
    public void jpaMany2ManyTest(){
        /**
         * 删除用户的同时也会删除用户_角色关联表
         */
        //userDao.deleteById("1066370498633486336");
        /**
         * 删除角色的时候不会删除用户_角色关联表
         * 但会删除角色_权限关联表
         */
        //roleDao.deleteById("1062944989845262336");

        /**
         * 在用户和角色关联的时候,比如用户(a)关联了两个角色(i和ii),那么在根据id查用户的时候,去看User实体里的roles角色Set集合,
         * 里面会报错:Unable to evaluate the expression Method threw 'org.hibernate.LazyInitializationException' exception.
         * 解决方案:加上    @Transactional注解
         * 问题原因:
         */
        User user = userDao.findById("1063705482939731968").get();
        System.out.println(user.getRoles().size());
    }

你可能感兴趣的:(解决错误)