我正在尝试刷新@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;
    ...
}

但是我没有-我也不想-用户实体中的项目集合。

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

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

为了更好的理解:
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

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

最佳答案

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

我假设项目确实确实是从数据库中出来的(使noop持久化),否则当您尝试刷新尚未提交的实体时,您应该会遇到 hibernate 异常。

关于JDBC和ORM之间的区别以及EntityManager实际执行的操作,这里似乎有些困惑。 em.persist不是SQL插入或SQL更新。它说“采用这个新实体并将其置于托管状态”。通常,这最终会导致SQL插入,但这在应用程序级别并不是什么意思。

看来您实际上是在告诉 hibernate 状态“我对此进行了一些更改,下次 session 同步时,请坚持执行它们,哦,您知道什么,我改变了主意,恢复为数据库中的内容。” em.persist不会直接在数据库中放置任何内容,那里可能仍然没有任何内容。

尝试在刷新之前将em.flush扔进去,您应该会看到您的用户。

(关于 session 的配置方式或事务管理方式,您没有说什么,所以我假设所有这些都在一个事务中。)

关于java - JPA @ManyToMany仅在一侧?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2804453/

10-10 13:43