【问题标题】:Hibernate subcriteria with FetchMode doesn't work使用 FetchMode 的休眠子标准不起作用
【发布时间】:2014-06-18 05:50:46
【问题描述】:

我想在一对多字段的某些条件下使用条件。

简单介绍一下我的模型,一个item 有多个options
因为我想通过过滤的options 获取item,并将其传递给JSON Parser(没有会话),所以我必须在我(查询它时获取选项。

在向选项添加限制之前,我已经编写了如下代码,它对我来说很好。

Item item = (Item)session.createCriteria(Item.class)                                        
                .setFetchMode("options", FetchMode.JOIN)
                .add(Restrictions.eq("id", id))
                .uniqueResult();

但是当我对options添加限制时,它会发生错误(确切地说,当被调用的函数试图访问项目时,搜索工作正常。)

Item item = (Item)session.createCriteria(Item.class)
                .setFetchMode("options", FetchMode.JOIN)
                .add(Restrictions.eq("id", id))
                .createCriteria("options").add(Restrictions.eq("status", ItemStatus.ABLE))
                .uniqueResult();

一个错误是:

failed to lazily initialize a collection of role: options, could not initialize proxy - no Session

我在子条件的末尾添加了 setFetchMode,结果是一样的。

发生了什么!?能说说解决办法吗?

【问题讨论】:

  • 我尝试删除 .setFetchMode("options", FetchMode.JOIN) 然后我也得到了正确的结果。
  • @Amogh 搜索数据不是我的问题,我的问题是在会话关闭后访问options
  • @Amogh 我设置获取模式的原因是为了在会话关闭后访问options
  • @Amogh 但是当我向options 添加限制时,出现错误。虽然我已将获取模式设置为加入选项。
  • 设置获取模式不用于在会话关闭后访问该关联。它讲述了如何获取关联。

标签: hibernate hibernate-criteria


【解决方案1】:

我认为您在关闭session 后尝试访问options 时遇到错误。根据休眠集合默认是延迟加载的。如果你想获取optionsitem,那么你必须在注释或映射文件中设置FetchType EAGER (FetchType.EAGER)

你能试试这个代码吗

Item item = (Item)session.createCriteria(Item.class)
            .setFetchMode("options", FetchMode.SELECT)
            .add(Restrictions.eq("id", id))
            .createCriteria("options").add(Restrictions.eq("options.status", ItemStatus.ABLE))
            .uniqueResult();

【讨论】:

  • 这不是我想要的答案,在使用子标准添加限制之前,它工作正常。
  • 你能调试你的代码吗?这样我们就可以知道您在哪一行得到异常。因为根据错误,它说您正在尝试在会话关闭时加载选项,或者您的会话管理配置设置为在您提交事务时关闭会话。我在我的代码中做了同样的事情,它工作正常。
  • @user1372488 是的,我的程序在关闭会话后访问options。在这两种情况下搜索数据都很好,但我的问题是如何在关闭会话后访问options。关闭会话后访问options 可以使用第一个代码。因为它将获取模式设置为加入。 (没有设置获取模式,它会发生同样的错误)但是第二个代码不起作用,我只是给options添加了限制!
  • statusoptionitem 的属性?
  • @crazy_rudy 您为status 添加的限制将应用于项目别名而不是选项。使用别名应用于options.status 等选项
猜你喜欢
  • 2015-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
相关资源
最近更新 更多