JPA - 合并后没有任何事情发生

时间:2015-12-12 19:58:00

标签: java jpa many-to-many

有人可以告诉我为什么在合并实体时没有任何反应?

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 个答案:

答案 0 :(得分:1)

用户实体中所做的更改未与您的数据库同步,因为用户实体是双向ManyToMany关系的非拥有方。 您正在使用mappedby =&#34;用户&#34;在用户实体中,所以所有者方是Book实体。

如果您更改ManyToMany的拥有方,您的代码应该有效,在ManyToMany双向关系中,您可以选择哪一方是您自己的一方(来自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;