当前位置: 首页 > 面试题库 >

JSF + Hibernate:集合未与任何会话关联

邵诚
2023-03-14
问题内容

首先,我将Java EE与EntityManager和PrimeFaces一起使用Hibernate。

我有一个EJB模块(业务逻辑和域)和两个WAR模块(Jersey WS和JSF PrimeFaces)。

我决定在JSF WAR模块中初始化延迟集合,以避免延迟初始化异常。我不使用扩展实体管理器。

@ManagedBean(name = "company")
@SessionScoped
public class CompanyBean {

    @EJB
    private CompanyFacade cf;

    ...

    public String showDetails(Long id) {
        company = cf.find(id);
        Hibernate.initialize(company.getCompanyTypes());
        Hibernate.initialize(company.getPrimaryUser());
        Hibernate.initialize(company.getBlocked());
        Hibernate.initialize(company.getAddresses());
        Hibernate.initialize(company.getContacts());
        return "DETAILS";
    }

    ...
}

我得到:

Caused by: org.hibernate.HibernateException: collection is not associated with any session at org.hibernate.collection.AbstractPersistentCollection.forceInitialization(AbstractPersistentCollection.java:474) at org.hibernate.Hibernate.initialize(Hibernate.java:417) at minepackage.CompanyBean.showDetails(CompanyBean.java:79) ...

我不明白 从数据库中获取初始化之前的一行时,必须有一个会话,不是吗?我以类似的方式在WS模块中初始化属性,并且在那里工作。

知道发生了什么事吗?


问题答案:

我认为在EJB完成后会话关闭,因此对象处于 分离 状态。所以Hibernate.initialize()不会再工作了。您在这里有多种选择:

  • 在客户端(在您的JSF bean或servlet过滤器中)打开事务。这样,您通话时会话仍将打开Hibernate.initialize()
  • 修改您的EJB以加载完整的对象和所有必需的集合。您可以使用访Hibernate.initialize()存联接和/或在那里使用。
  • 在EJB中创建更细粒度的API。方法类似CompanyFacade.getAddressesByCompany()

我希望将后两者结合起来。使用访存联接在您的find方法中加载一对一和多对一关系,并添加额外的方法来加载一对多集合(如地址)。由于它减少了数据库查询的次数,因此也将提高后端的性能。



 类似资料:
  • 我试图更新MySql数据库中的记录。更新时引发了以下异常 我检查会话。它关闭在每个方法的最后块中。无法弄清楚出了什么问题。我能够毫无问题地使用其他方法插入更新操作,但只有保存更新用户豆方法抛出异常 UserDAOImpl: 服务输入: applicationContext.xml: 我能够使用相同的配置执行所有数据库操作,但当我从serviceImpl调用块用户()方法时,它调用DAO方法,并且S

  • 我使用Hibernate和Spring,我在执行以下代码时得到这个异常: 我已经阅读了一些关于Hibernate的会话管理,我有一种预感,这段代码的会话处理很差。举行两次公开会议的原因可能是什么?Hibernate API表示函数返回一个新的会话对象或现有的会话对象。在这种情况下,它从哪里获取现有会话对象?如果它创建了一个新的会话对象,那么处理所涉及的集合仍然可以吗? 任何帮助将不胜感激。提前感谢

  • 那么,除了避免使用jackson-hibernate-mapper进行测试之外,还有什么方法可以避免这个问题吗?使用DTO和Dozer代替domain object不被认为是一种解决方案(将来会这样做,但不是现在)。 提前致谢

  • 问题内容: 我已经“继承”了一个项目,该项目使用Spring批注来管理Hibernate的事务/会话。或至少是注定的。当前,Hibernate会话永远不会被刷新(它们设置为FLUSH_MODE_NEVER),并且DAO需要手动刷新才能将任何数据写入数据库。 同样,所有DTO对象都驻留在hibernate的内存中,最终导致OutOfMemory错误。 我相信我需要告诉Spring / Hiberna

  • 我对Hibernate中的会话和事务的概念有点困惑。据我所知,Hibernate使用会话(持久性上下文),它基本上是需要持久,删除或数据库中任何内容的实体的缓存。会话封装事务,因此我启动一个会话,然后创建一个事务。事务关闭后,持久性上下文中的所有内容都将刷新到数据库,如果我关闭会话,也会发生同样的事情。 为什么我需要两者?我可以在不创建交易的情况下做同样的事情吗?

  • 问题内容: 我有一个使用spring和hibernate的java stuts2 Web应用程序。 我越来越。 SpringBean.xml hibernate.cfg.xml CustomerServiceImpl.java CustomerDaoImpl.java CustomerAction.java 我得到的例外 问题答案: 您在Spring配置中指定了一个事务管理器,但是没有关于何时或何