2

我在使用延迟加载的 PrimeFaces (3.2) 数据表时遇到问题,数据是使用 Hibernate (3.6) 从 MySQL 数据库加载的。

问题是我在数据表中得到了重复的结果。我对此做了很多研究,主要问题是使用“EAGER”-加载 OneToMany/ManyToOne/... 关系。我的实体有 5 个多对一和 1 个单对一关系。

结果是使用 DAO 加载的,应该返回 2 行。数据表按以下顺序显示 4 行:

  1. 结果 1
  2. 结果 2
  3. 结果 1
  4. 结果 2

count(*) 查询返回正确的行数 (2)。

直接使用当 hibernate 的“show_sql”开关设置为 true 时记录的 SQL 查询,它正确返回了 2 行。

虽然起初其中一些关系是预先加载的,但我将它们全部更改为延迟加载,但没有成功。我调试了正确返回 2 行的 DAO 方法。然后将数据加载到 primefaces 数据表中并在某处复制。

然后我使用另一个用户帐户尝试了相同的操作,发现没有重复的行。

然后我从数据库中删除了相关实体的所有记录,但没有成功。

我真的不知道这里可能有什么问题。我什至消除了所有的 ManyToOne/... 关系,并将外键直接映射为整数值,以避免任何连接并且没有任何改变。

我不知道代码的哪些部分可能对您有所帮助,但如果需要,我可以与您分享。

提前感谢您的帮助!

[编辑] 使用结果转换器并将实体映射到 Set 而不是 List 也无济于事,数据库因此休眠总是返回正确的行数,但在 DAO 和数据表。

[编辑 2] 经过更多调查,我意识到这只发生在分页的 pageSize 设置为 15 时(有 3 个可能的值可供选择:5、10 和 15)。

当设置为 10 时,一切都按预期工作。我真的不明白这有什么问题,因为具有不同实体的相同代码在另一个页面上工作。

4

1 回答 1

0

在我的情况下,如果我将列出的类的映射字段从 EAGER 更改为 LAZY,它就会起作用。更改 pageSize 没有区别(*编辑 2)。另外,我不得不添加到 web.xml

<filter>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
    <init-param>
        <param-name>singleSession</param-name>
        <param-value>false</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>OpenSessionInViewFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

为了避免出现此错误 org.hibernate.LazyInitializationException...没有会话或会话已关闭

于 2016-04-17T15:45:16.590 回答