Hibernate和Glassfish Lazyload

时间:2013-03-30 23:15:46

标签: java hibernate glassfish lazy-loading

我在Java Web Application中有一个项目,计划是将Glassfish的功能输出到PHP(nuSOAP)。

我在mySQL中创建了我的BD,包括所有表,关系,主键和外键。

之后我打开我的NetBeans,New Project - > Java Web APP。

我所做的步骤是 首先创建Hibernate配置向导,然后创建Hibernate逆向工程向导,然后从数据库创建Hibernate映射文件和POJO,最后创建HibernateUtil(命名连接)

我的实体是:许多玩家的许多团队一级的许多一年级的俱乐部

所以,现在我的Java项目中包含了所有实体。并为俱乐部创建了一个DAO:

public List<Club> listClubs(){
    try{
        session.beginTransaction();
        List<Club> listClub = (List<Club>)session.createQuery("from Club").list();
        session.getTransaction().commit();
        session.close();
        return listClub;
    }catch(Exception e){
        System.out.println("Erro ao listar os clubes"); 
        System.out.println(e.getMessage());
    }
    return null;
}

之后我想创建一个WebService来输出所有我的俱乐部列表。

@WebMethod(operationName = "listAllClubs")
public List<Club> listAllClubs() {
    ClubDAO pdo = new ClubDAO();
    List<Club> temp = pdo.listClubs();
    System.out.println("[WS:::]Tamanho do array devolvido: " + temp.size());
    return temp;
}

在我在glassfish页面中测试我的WebService后,我收到了这个错误:

> Service invocation threw an exception with message : null; Refer to the server log for more details

当我收到服务器日志时,我看到了:

> SEVERE: failed to lazily initialize a collection of role: pt.dai.entities.Club.grades, no session or session was closed

我已经在互联网上搜索了这个错误,我已经解决了将实体的xml更改为default-lazy ='false'但是当这将所有俱乐部信息返回给PHP时,我的nuSOAP会分解大量数据..

我如何使用lazzyLoad并将我的数据发送到WebService?

感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

看起来这不是延迟加载问题。

延迟加载允许您不从数据库中读取嵌套实体,而不会显式解决。

在您的情况下,即使是延迟加载,您也会尝试发送所有数据,因此所有这些数据都将从数据库中读取。

如果您不想发送所有内容,那么您应该限制查询。否则,您可以将数据拆分为几个部分并单独发送。


编辑:删除关系是最简单但不令人满意的解决方案。

您的问题的根源是序列化。看起来您的实体具有双向或周期关系。您需要通过删除冗余关系或将所有此类成员标记为瞬态来解决此问题,从而禁止其序列化。

P.S。如果不关闭Hibernate会话,它将不会被释放,也不会返回到连接池。几次之后,您的连接池将为空,所有未来的查询将在等待免费会话时挂起。