2015-12-12 3 views
0

Кто-нибудь может сказать мне, почему ничего не происходит, когда я объединяю сущность?JPA - После слияния ничего не происходит

User.java (Entity)

@ManyToMany(mappedBy="users", targetEntity=Books.class,cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) 
private List<Books> books; 

Books.java (Entity)

@ManyToMany (targetEntity = User.class,cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) 
private List<User> users; 

returnBookServlet.java

int userId = (int) session.getAttribute("userId"); 
String stringIdBook = request.getParameter("idBook"); 
UserDAO daoUser = (UserDAO) request.getAttribute("userDao"); 
User user = daoUser.getUser(userId); 
List<Books> booksOrderedByUser = user.getBooks(); 

for (Books x : booksOrderedByUser) { 
    String idBookString = Integer.toString(x.getIdBook()); 
    if (idBookString.equals(stringIdBook)) { 
     booksOrderedByUser.remove(x); 
     break; 
    } 
} 

user.setBooks(booksOrderedByUser); 
entityManager.getTransaction().begin(); 
entityManager.merge(user); 
entityManager.flush(); 
entityManager.getTransaction().commit(); 
entityManager.close(); 

После того, как петли и перед Еогеасп отобразить список с помощью System.out.println() и правильно удалить выбранную книгу, но ничего не происходит в базе данных, что я сделал неправильно?

ответ

1

Изменения, выполненные в пользовательской сущности, не синхронизированы с вашей базой данных, поскольку пользовательский объект является стороной, не являющейся собственностью вашего двунаправленного отношения ManyToMany. Вы используете mappedby = "users" в пользовательской сущности, поэтому сторона владельца является объектом Book.

Ваш код должен работать, если вы измените владеющее сторону вашего ManyToMany, в ManyToMany двунаправленной связи, которые вы можете выбрать, какая сторона вашей владеющее сторона (от JPA 2.1 спецификации):

Каждый многие-ко-многим ассоциация имеет две стороны, принадлежащую стороне и сторону, не принадлежащую, или обратную сторону. Если ассоциация двунаправленная, обе стороны могут быть обозначены как принадлежащая сторона. Если отношение двунаправленное, сторона, не владеющая, должна использовать элемент mappedBy аннотации ManyToMany до , чтобы указать поле отношения или свойство стороны-владельца.

Затем, если вы хотите использовать один и тот же код, измените АННОТАЦИИ на:

User.java (Entity)

@ManyToMany(targetEntity=Books.class,cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) 
private List<Books> books; 

Books.java (Entity)

@ManyToMany (mappedBy="books",targetEntity = User.class,cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.REFRESH}) 
private List<User> users; 
Смежные вопросы