【问题标题】:Spring hibernate error about lazy loading关于延迟加载的Spring休眠错误
【发布时间】:2011-06-18 17:54:45
【问题描述】:

我只是一个 spring + hibernate 初学者。我正在做一个简单的项目,我为事务、一个简单的服务、一个简单的 dao 和所有带注释的 bean 设置了一切。

使用列表工作,我可以使用条件查询列出对象及其属性。但是如果我尝试加载一个对象:

Session sess = sessionFactory.getCurrentSession();
Ordine res = (Ordine) sess.load(Ordine.class, id);
return res;

查询似乎工作正常,但是当视图尝试读取属性(字符串)时,我得到了一个讨厌的异常:

org.hibernate.LazyInitializationException: 无法初始化代理 - 没有会话

我什至注意到这是启动日志:

INFO:[class org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean] 类型的 Bean 'mySessionFactory' 不符合被所有 BeanPostProcessor 处理的条件(例如:不符合自动代理的条件)

这一切意味着什么?

【问题讨论】:

    标签: java hibernate spring


    【解决方案1】:

    您可能需要使用OpenSessionInViewFilter

    【讨论】:

      【解决方案2】:

      在我看来,你有几个选择

      • 强制您的对象不被延迟加载(例如,在您的持久性注释上设置fetch=FetchType.EAGER)。
      • OpenSessionInViewFilter
      • 在数据层中调用例程的方法(以加载值),然后在视图中调用它们。

      [编辑] 这似乎根本不像我最初建议的那样工作。

      • 添加transactions。使用@Transactional 注释您的控制器例程。

      【讨论】:

      • 使用@Transactional注释您的控制器例程 是否有效?视图超出了控制器的范围,不是吗?
      • 我试过一次,如果我没记错的话它表现不错(不过我的记忆可能很模糊)。这当然假设您拥有事务扫描所需的所有弹簧配置。
      • 这个答案是正确的,减去每个肖恩评论的@Transactional。
      • 我试着把FetchType.Eager,没有成功。我把 OpenSessionInViewIntercepto.... 什么都没有。
      • 我都试过了,可以验证它们是否有效。你能用更多的代码来说明你在做什么吗?例如,@OneToMany(..., fetch=...) ?此外,在使用 OSIV 时,您应该将其放在与控制器定义相同的 appcontext 中,参见例如this.
      【解决方案3】:

      肖恩,

      Johan 关于设置 fetch=FetType.EAGER 的建议是您最简单的解决方案。不过,您应该小心使用此解决方案。有时您可以通过修改您的 dao 查询以对您感兴趣的相关实体进行左连接获取来解决您的问题。例如:

      Query q = this.em.createQuery("select x from PrimaryEntity x \n"
      + "left join fetch x.secondaryEntityField \n "
      + "where x.selectionProperty = :selection");
      

      【讨论】:

      • 嗯,肖恩没有问这个问题:-)
      【解决方案4】:

      org.hibernate.Hibernate -class 有一些方便的静态实用方法,例如参见Hibernate.initialize。不过,您仍然需要一个公开的会话。最简单的方法可能是使用 OpenSessionInViewFilter,将 fetch-types 设置为 eager 或修改查询以加载惰性关系,如其他答案中所建议的那样。

      【讨论】:

        猜你喜欢
        • 2011-06-15
        • 1970-01-01
        • 2013-05-26
        • 1970-01-01
        • 1970-01-01
        • 2013-03-15
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多