zir*_*iri 2 java jsf hibernate java-ee primefaces
首先,我使用Java EE,Hibernate与EntityManager和PrimeFaces.
我有一个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";
}
...
}
Run Code Online (Sandbox Code Playgroud)
我得到:
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()
不再工作了.这里有多个选项:
Hibernate.initialize()
.Hibernate.initialize()
在那里使用.CompanyFacade.getAddressesByCompany()
.我更喜欢后两者的组合.使用fetch join来加载方法中的一对一和多对一关系,find
并添加额外的方法来加载一对多集合(如地址).这还将提高后端的性能,因为它减少了数据库查询的数量.
归档时间: |
|
查看次数: |
4720 次 |
最近记录: |