JPA @ManyToMany只在一边?

Eth*_*roy 5 java many-to-many hibernate jpa

我正在尝试刷新@ManyToMany关系,但它被清除了......

我的Project类看起来像这样:

@Entity
public class Project {
    ...
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.EAGER)
    @JoinTable(name = "PROJECT_USER",
    joinColumns = @JoinColumn(name = "PROJECT_ID", referencedColumnName = "ID"),
    inverseJoinColumns = @JoinColumn(name = "USER_ID", referencedColumnName = "ID"))
    private Collection<User> users;
    ...
}
Run Code Online (Sandbox Code Playgroud)

但我没有 - 我不想要 - 用户实体中的项目集合.

当我查看生成的数据库表时,它们看起来很好.它们包含所有列和约束(主键/外键).

但是当我持有一个包含用户列表的项目(并且用户仍在数据库中)时,映射表不会更新得到更新,但是当我之后刷新项目时,将清除用户列表.

为了更好地理解:

Project project = ...; // new project with users that are available in the db
System.out.println(project getUsers().size()); // prints 5
em.persist(project);
System.out.println(project getUsers().size()); // prints 5
em.refresh(project);
System.out.println(project getUsers().size()); // prints 0
Run Code Online (Sandbox Code Playgroud)

那么,如何刷新用户和项目之间的关系?

Aff*_*ffe 2

该错误似乎出现在您遗漏的代码中......

我假设该项目实际上确实来自数据库(使持久化成为无操作),否则当您尝试刷新尚未提交的实体时,您应该会收到休眠异常。

关于 JDBC 和 ORM 之间的区别以及 EntityManager 的实际用途,似乎存在一些混淆。em.persist 不是 SQL 插入或 SQL 更新。它说“采用这个新实体并将其置于托管状态。” 通常这最终会导致 SQL 插入,但这并不是它在应用程序级别的含义。

看起来你本质上是在告诉 hibernate“我对此做了一些更改,下次同步会话时请保留它们,哦,你知道吗,我改变了主意,恢复到数据库中的内容。” em.persist 不会直接将任何内容放入数据库中,数据库中的内容可能仍然是“什么都没有”。

尝试在刷新之前放入 em.flush,您应该会看到您的用户。

(您没有提及有关会话如何配置或如何管理事务的任何内容,因此我假设所有这些都在一个事务中。)