我正在尝试刷新@ManyToMany 关系,但它被清除了......
我的项目类如下所示:
@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
那么,如何刷新User和Project之间的关系呢?
最佳答案
错误似乎出在您遗漏的代码中...
我假设该项目确实是从数据库中出来的(使 persist 成为一个 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/