2015-12-12 68 views
0

有人可以告訴我爲什麼在合併實體時沒有任何反應?JPA - 合併後沒有任何反應

User.java(實體)

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

Books.java(實體)

@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(); 

後和foreach循環之前我顯示經由System.out.println()列表它正確地刪除選擇的書,但沒有發生在數據庫中,我做錯了什麼?

回答

1

用戶實體中所做的更改與您的數據庫不同步,因爲用戶實體是您的雙向ManyToMany關係的非擁有方。 您在User實體中使用mappedby =「users」,所以所有者端是Book實體。

如果你改變了多對多的擁有方,在多對多的雙向關係中,你可以選擇你的代碼應工作哪邊是你的擁有方(從JPA 2.1規範):

每多到多協會有兩方面,即擁有方和非擁有方或反方。如果 該關聯是雙向的,則任一方都可以被指定爲擁有方。如果雙向關係爲 ,則非擁有方必須使用ManyToMany批註的mappedBy元素來指定擁有方的關係字段或屬性。

然後,如果你想使用相同的代碼,改變你的anotations到:

User.java(實體)

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

Books.java(實體)

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