постоянство «многие ко многим»

#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:

Пожалуйста, включите свой код для создания пользователей, который не работает, и включите полную трассировку стека исключений.

Вы добавляете нулевое значение в список?

Убедитесь, что вы используете управляемые версии объектов и правильно объединяете свои объекты.