2
當我在rich:dataTable中加載惰性加載列表時,我總是得到「無法懶惰地初始化角色集合」錯誤。與JPA的會話
這當然是因爲會話在此狀態下關閉。
我的問題我怎樣才能使用會話通過使用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;
}
如果您不想保持會話打開,您將不得不加載數據。如果你不想急於獲取你是不幸的... –
在這裏,我們去:http://stackoverflow.com/questions/12770450/standard-jpa-method-to-initialize-lazy-entity –
但是沒有辦法讓會話與JPA保持一致?我對這個JPA主題頗爲陌生。到目前爲止,我一度使用HibernateUtil方法。但我寧願避免它,只是使用JPA與persictence.xml並沒有額外的hibernate.cfg.xml。 – Dave