#jakarta-ee #jpa #jsf-2 #persistence
#джакарта-ee #jpa #jsf-2 #постоянство
Вопрос:
Я новичок в Java EE, и я создал для себя учебный пример, в котором я могу регистрировать пользователей и сохранять данные в базе данных, я использую Glassfish, EclipseLink JPA 2.0 и JSF framework. База данных содержит три таблицы: user(id [pk], имя, пол, …), hobby(id [pk], hobby_name) и user_hobby, которые описывают отношения «многие ко многим» и содержат только user_id и hobby_id.
в User.java класс сущности, я объявляю связь как таковую:
...
@ManyToMany(fetch=FetchType.EAGER)
@JoinTable(
name="user_hobby",
joinColumns=@JoinColumn(name="user_id"),
inverseJoinColumns=@JoinColumn(name="hobby_id")
)
private List<Hobby> hobbies;
public List<Hobby> getHobbies() {
return hobbies;
}
public void setHobbies(List<Hobby> hobbies) {
this.hobbies = hobbies;
}
...
и в хобби.класс 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)
Комментарии:
1. Первая строка трассировки стека исключения должна точно указывать, в какой строке кода происходит это исключение. Показ нам трассировки стека поможет нам помочь вам.
2. привет, спасибо за ответ, на самом деле, в нем не указано, почему возникает исключение, просто скажите мне nullpointerexception, пожалуйста, обратитесь к обновлению.
3. Из вашей трассировки стека ошибка в
org.eclipse.persistence.internal.sessions.UnitOfWorkImpl.checkForUnregisteredExistingObject(UnitOfWorkImpl.java:745)
, к сожалению, вы не указали достаточно строк, чтобы выяснить, какая часть вашего кода вызывает это. В принципе, нам нужно больше вашей трассировки стека, по крайней мере, до первой строки, которая начинается сat
, за которой следует полное имя одного из ваших классов.
Ответ №1:
после долгой борьбы с этими проблемами я, наконец, решил проблему. проблема заключалась в преобразовании между строкой в представлении и объектом в вспомогательном компоненте. Я использовал решение для сопоставления, которое является одним из методов, предложенных в этом сообщении: http://balusc.blogspot.com/2007/09/objects-in-hselectonemenu.html . Спасибо.
Ответ №2:
Пожалуйста, включите свой код для создания пользователей, который не работает, и включите полную трассировку стека исключений.
Вы добавляете нулевое значение в список?
Убедитесь, что вы используете управляемые версии объектов и правильно объединяете свои объекты.