簡體   English   中英

JPA-合並后無任何反應

[英]JPA - Nothing happens after merge

有人可以告訴我為什么合並實體時什么也沒發生?

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()顯示列表,它可以正確刪除所選的書,但是數據庫中什么也沒有發生,我做錯了什么?

User實體中所做的更改不會與您的數據庫同步,因為User實體是雙向ManyToMany關系的非所有者方。 您正在使用User實體中的mappingby =“ users”,因此所有者端是Book實體。

如果您更改ManyToMany的擁有方,則代碼應該可以工作,在ManyToMany雙向關系中,您可以選擇哪一方是您的擁有方(根據JPA 2.1規范):

每個多對多關聯都有兩個方面,即擁有方和非擁有方或反向方。 如果關聯是雙向的,則任何一方都可以指定為擁有方。 如果關系是雙向的,則非擁有方必須使用ManyToMany批注中的mappingBy元素來指定擁有方的關系字段或屬性。

然后,如果要使用相同的代碼,請將注釋更改為:

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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM