多对多持久性
问题描述:
我是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)
答
经过长时间的这个问题苦苦挣扎,我终于解决了这个问题。问题是关于在视图中的字符串和在后台bean中的对象之间的转换。我使用了映射解决方案,这是本文提出的方法之一:http://balusc.blogspot.com/2007/09/objects-in-hselectonemenu.html。谢谢。
答
请附上您的代码来创建失败,包括完整的异常堆栈跟踪用户。
您是否将一个空值添加到列表中?
确保您使用的是对象的受管版本并正确地合并对象。
异常的堆栈跟踪的第一行应该精确地告诉你这个异常发生在哪一行代码。向我们展示堆栈跟踪将帮助我们帮助您。 –
您好,感谢您的回复,实际上,它没有说明为什么发生异常,只是告诉我nullpointerexception,请参考更新。 – bingjie2680
从你的堆栈跟踪错误是'org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.checkForUnregisteredExistingObject(UnitOfWorkImpl.java:745)'不幸的是你没有给出足够的代码来找出你的代码的哪一部分导致了这一点。基本上我们需要更多的堆栈跟踪信息,至少在第一行以'at'开头,后面跟着一个类的全名。 – Thor84no