我正在尝试刷新@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
那么,如何刷新用户和项目之间的关系?
答案 0 :(得分:2)
错误似乎出现在你遗漏的代码中......
我假设该项目实际上是从数据库中出来的(使得持久化为noop),否则当您尝试刷新尚未提交的实体时,您应该获得一个hibernate异常。
这里似乎有点混淆JDBC和ORM之间的区别以及EntityManager实际上做了什么。 em.persist不是SQL插件或SQL更新。它说'把这个新实体带入管理状态。'通常这最终会导致SQL插入,但这不是它在应用程序级别的含义。
看起来你实际上是在告诉hibernate“我对此进行了一些更改,下次会话同步时请坚持下去,哦,你知道什么,我改变主意,回到数据库中的内容。” em.persist没有直接在数据库中放置任何东西,可能仍然“没有”。
在刷新之前尝试扔掉em.flush,你应该看到你的用户。
(你还没有说过如何配置你的会话或你如何管理交易,所以我假设所有这些都是在一次交易中。)