Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 冬眠和玻璃鱼懒散_Java_Hibernate_Glassfish_Lazy Loading - Fatal编程技术网

Java 冬眠和玻璃鱼懒散

Java 冬眠和玻璃鱼懒散,java,hibernate,glassfish,lazy-loading,Java,Hibernate,Glassfish,Lazy Loading,我有一个Java Web应用程序项目,计划将Glassfish的功能输出到PHP(nuSOAP) 我已经在mySQL中创建了我的BD、所有表、关系、主键和外键 之后,我打开我的NetBeans,newproject->javaweb应用程序 我所做的步骤是 首先创建Hibernate配置向导,然后创建Hibernate反向工程向导,然后从数据库创建Hibernate映射文件和POJO,最后创建Hibernate EUTIL(命名连接) 我的实体是:俱乐部一对多等级一对多团队一对多球员 所以,现在

我有一个Java Web应用程序项目,计划将Glassfish的功能输出到PHP(nuSOAP)

我已经在mySQL中创建了我的BD、所有表、关系、主键和外键

之后,我打开我的NetBeans,newproject->javaweb应用程序

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

我的实体是:俱乐部一对多等级一对多团队一对多球员

所以,现在我的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;
}
当我得到服务器日志时,我看到:

> SEVERE: failed to lazily initialize a collection of role: pt.dai.entities.Club.grades, no session or session was closed
我已经在互联网上搜索了这个错误,我已经解决了将实体的xml更改为默认值lazy='false'的问题,但是当这将所有俱乐部信息返回到PHP时,我的nuSOAP将与大量数据分离

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


谢谢你的帮助

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

延迟加载允许您不从数据库中读取嵌套实体,而不会显式地对其进行寻址

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

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


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

问题的根源在于序列化。看起来您的实体具有双向或循环关系。您需要通过删除冗余关系或将所有此类类成员标记为瞬态(这会禁止它们的序列化)来解决此问题


另外,如果您不关闭Hibernate会话,它将不会被释放,也不会返回连接池。几分钟后,您的连接池将为空,并且在等待空闲会话时,您将来的所有查询都将挂起。

如何修复此问题?删除关系?嗨,谢谢Maksim,要做到这一点,我只需要在课程开始时做一个注释?比如说“暂时的”,不@瞬态是JPA注释。这意味着该字段不会被持久化,而Java的transient关键字意味着该字段不会被序列化。例如:“private transient int myInt=0;”我,我已经用transient解决了这个问题,但是现在我有一个问题:看,我有球员->团队->教练->人力资源,球员也有人力资源参考。在本例中(列出所有玩家),我在Teams方法中放置了一个XMLTransient:getCoachs,但是如果我想列出包含教练信息的所有团队,我需要再次添加该Transient。我怎样才能解决这个问题呢?首先,如果我以前的答案对你有帮助,如果你能投票或者把它标为正确答案,那就太好了。关于您的第二个问题,如果您使用适当的代码片段创建新的问题会更好。我所能建议的最简单的解决方案是将
ID
s的
Coachs
存储到
Teams
类中。此类ID将被序列化,因此您可以在单独的web-request中请求ID所需的真实
Coach
。如果我对会话提交和会话关闭进行注释,则错误将更改,然后给出“在对象图中检测到一个循环。这将导致无限深的XML:”
> 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