gpt4 book ai didi

java - JSF + hibernate : Collection is not associated with any session

转载 作者:行者123 更新时间:2023-11-30 05:53:09 33 4
gpt4 key购买 nike

首先,我使用 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: 集合不与任何 session 关联
在 org.hibernate.collection.AbstractPersistentCollection.forceInitialization(AbstractPersistentCollection.java:474)
在 org.hibernate.Hibernate.initialize(Hibernate.java:417)
在 minepackage.CompanyBean.showDetails(CompanyBean.java:79)
...

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

知道发生了什么吗?

最佳答案

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

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

我更喜欢后两者的结合。使用提取连接在您的 find 方法中加载一对一和多对一关系,并添加额外的方法来加载一对多集合(如地址)。这也将提高后端的性能,因为它减少了数据库查询的数量。

关于java - JSF + hibernate : Collection is not associated with any session,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10928138/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com