许多返回的记录导致Hibernate的堆栈溢出

时间:2008-12-12 08:57:53

标签: java hibernate stack-overflow

如果DB有很多返回记录。它会得到stackoverflow问题。 User是一个类,它具有一对多的关系(对另外3个类)。当我打印出SQL时,我发现系统多次运行相同的查询来从DB获取数据。有谁知道问题是什么?

result.addAll(getCurrentSession().createCriteria(User.class)
    .add(Restrictions.ilike("name", "tom", MatchMode.ANYWHERE))
    .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
    .list());

3 个答案:

答案 0 :(得分:0)

如果您正在寻找名字中只有汤姆的用户,那么除非您有很多%tom%hehe,否则它不会耗尽内存。

您可以尝试对其进行限制,以便它只返回您可以一次处理的一些。

我不确定是否有人可以在没有更多信息的情况下弄清楚为什么它会运行相同的查询。

答案 1 :(得分:0)

你有没有机会使用EntityMode.DOM4J? (即Hibernate - > XML而不是Hibernate - > POJO)。嵌套关系在没有调整的情况下不起作用,因为XML生成器无限地递归POJOS处理它们的位置。

我可以详细说明,但如果您不使用DOM4J,那么问题就是其他问题。

答案 2 :(得分:0)

有助于准确了解您所看到的重复查询。正如其他人所指出的那样,我们只是在没有看到你的映射的情况下进行推测。您可能正在遇到Hibernate的渴望获取。这是Hibernate尝试为每个用户(以及他们的地址,电话,宠物等)加载整个对象图的地方,这些用户匹配包含'tom'查询的通用名称。尝试关闭Hibernate映射文件或注释中的用户属性的默认eager提取,然后执行以下操作:

假设您正在查看表USER_ADDRESS (hibernate property "addresses")USER_PHONE (property "phones")USER_PET (property "pets")的大量重复查询。使用以下条件调用在原始查询中连接这些属性并减少重复查询。 Hibernate知道如何将这些列拆分为单独的对象。您还可以尝试添加最大数量的返回结果。

Criteria myUsers = getCurrentSession().createCriteria(User.class);
myUsers = myUsers.add(Restrictions.ilike("name", "tom", MatchMode.ANYWHERE));
myUsers.createCriteria("addresses"); // NEW
myUsers.createCriteria("phones"); // NEW
myUsers.createCriteria("pets"); // NEW
myUsers.setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY);
myUsers.setMaxResults(100); // NEW
result.addAll(myUsers.list());

您可以在第15.4-15.6节here

中了解详情