我是Java EE新手,我爲自己設置了一個學習案例,我可以註冊用戶並將數據保存到數據庫,我使用Glassfish,EclipseLink JPA 2.0和JSF框架。該數據庫包含三個表:user(id [pk],name,gender,...),愛好(id [pk],hobby_name)和描述多對多關係並且只包含user_id和hobby_id的user_hobby。多對多持久性
在User.java實體類,我聲明的關係爲這樣:
...
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(
name="user_hobby",
[email protected](name="user_id"),
[email protected](name="hobby_id")
)
private List<Hobby> hobbies;
public List<Hobby> getHobbies() {
return hobbies;
}
public void setHobbies(List<Hobby> hobbies) {
this.hobbies = hobbies;
}
...
並在Hobby.java類,我聲明雙向這樣:
...
@ManyToMany(mappedBy="hobbies",fetch=FetchType.EAGER)
private List<User> users;
public List<User> getUsers() {
return users;
}
public void setUsers(List<User> users) {
this.users = users;
}
...
在JSF我輸出所有愛好表中包含預插入值的愛好,如:
<h:selectManyListbox id ="hobb" label="Hobbies" value="#{userController.user.hobbies}" >
<f:selectItems value="#{itemController.hobbyItems}"/>
</h:selectManyListbox>
和相應的itemcontroller有這個方法:
public List<SelectItem> getHobbyItems(){
List<SelectItem> items=new ArrayList<SelectItem>();
//fetch all hobbies from database
List<Hobby> hobbies=hobbyFacade.findAll();
for(Hobby h:hobbies)items.add(new SelectItem(h,h.getHobby()));
return items;
}
在這裏你可以看到,我注入愛好的對象列表到視圖,讓user.hobbies得到它擱置。
當我創建用戶時,如果我不選擇業餘愛好,那麼創建成功並且數據被持久化到數據庫,但是如果我選擇任何愛好,服務器會拋出一個空指針異常,我無法確定爲什麼,我花了將近一天的時間來調試,但無法取得任何進展。有沒有人可以幫我解決這個問題,我非常感謝。如果您需要更多關於設置的信息,請告訴我。
更新異常(前三行):
WARNING: java.lang.NullPointerException
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.checkForUnregisteredExistingObject(UnitOfWorkImpl.java:745)
at org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.discoverAndPersistUnregisteredNewObjects(UnitOfWorkImpl.java:4124)
異常的堆棧跟蹤的第一行應該精確地告訴你這個異常發生在哪一行代碼。向我們展示堆棧跟蹤將幫助我們幫助您。 –
您好,感謝您的回覆,實際上,它沒有說明爲什麼發生異常,只是告訴我nullpointerexception,請參考更新。 – bingjie2680
從你的堆棧跟蹤錯誤是'org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.checkForUnregisteredExistingObject(UnitOfWorkImpl.java:745)'不幸的是你沒有給出足夠的代碼來找出你的代碼的哪一部分導致了這一點。基本上我們需要更多的堆棧跟蹤信息,至少在第一行以'at'開頭,後面跟着一個類的全名。 – Thor84no