当我在rich:dataTable中加载延迟加载列表时,我总是得到“懒得初始化角色集合”错误。
这当然是因为会议在这种状态下关闭。
我的问题如何通过使用JPA(无弹簧等)来使用会话。我真的需要HibernateUtil的东西或Hibernate.Initialize(..)。我宁愿不使用这个Hibernate特定的东西,只是普通的JPA。没有EAGER获取。
我目前的代码:
实体:
@SuppressWarnings("serial")
@Entity
@Table(name = "user", uniqueConstraints = {
@UniqueConstraint(columnNames = "username"),
@UniqueConstraint(columnNames = "email")})
public class User implements Serializable {
...
@OneToMany(mappedBy="user", fetch=FetchType.LAZY)
private List<UserTournament> userTournament = new ArrayList<UserTournament>();
...
}
DAO:
@Stateless(name = "usercontroller")
public class UserController implements UserControllerInterface {
@PersistenceContext
private EntityManager em;
...
@Override
public List<UserTournament> getUserTournaments(Integer userid) {
User user = loadUser(userid);
return user.getUserTournament();
}
...
}
命名Bean:
@Named("myTournBean")
@ViewScoped
public class MyTournamentsBean implements Serializable {
@EJB
private UserControllerInterface userController;
private List<UserTournament> tournaments;
...
@PostConstruct
public void init() {
...
tournaments = userController.getUserTournaments(userid);
}
...
}
XHTML:
<h:panelGrid columns="3" columnClasses="titleCell">
<rich:dataScroller for="table" maxPages="5" />
<rich:dataTable value="#{myTournBean.tournaments}" var="tourn"
id="table" rows="10">
<rich:column>
<f:facet name="header">
<h:outputText value="Id" />
</f:facet>
<h:outputText value="#{tourn.id}" />
</rich:column>
</rich:dataTable>
<rich:dataScroller for="table" maxPages="5" />
</h:panelGrid>
编辑:
link形式@BoristheSpider非常有帮助。我没有完全通过它,但这已经解决了我的问题:
@Stateful
@ConversationScoped
public class Service
{
@PersistenceContext(type = PersistenceContextType.EXTENDED)
private EntityManager em;
}
答案 0 :(得分:1)
如果你不希望你的类依赖于Hibernate,那么创建一个实用程序类并依赖于这个实用程序类来初始化你的关联:
public class JPAUtils {
public static void initialize(...) {
Hibernate.initialize(...);
}
}
当您更改JPA提供程序(几乎没有机会发生)时,请使用新JPA提供程序的相应帮助程序类重写此方法,或者只需调用对象或集合的方法进行初始化。 / p>