使用Hibernate在JSF / PF Datatable中重复行

时间:2012-05-29 15:58:46

标签: hibernate jsf-2 primefaces

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

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

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

  1. 结果1
  2. 结果2
  3. 结果1
  4. 结果2
  5. count(*) - query返回正确的行数(2)。

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

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

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

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

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

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

    提前感谢您的帮助!

    [编辑] 使用结果转换器并将实体映射到Set而不是List也没有帮助,数据库因此hibernate总是返回正确的行数,但必须在DAO和Datatable之间的某处发生某些事情。 / p>

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

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

1 个答案:

答案 0 :(得分: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 ...没有关闭会话或会话