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