JPA @ManyToMany只在一边?

时间:2010-05-10 16:34:29

标签: java hibernate jpa many-to-many

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

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

1 个答案:

答案 0 :(得分:2)

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

我假设该项目实际上是从数据库中出来的(使得持久化为noop),否则当您尝试刷新尚未提交的实体时,您应该获得一个hibernate异常。

这里似乎有点混淆JDBC和ORM之间的区别以及EntityManager实际上做了什么。 em.persist不是SQL插件或SQL更新。它说'把这个新实体带入管理状态。'通常这最终会导致SQL插入,但这不是它在应用程序级别的含义。

看起来你实际上是在告诉hibernate“我对此进行了一些更改,下次会话同步时请坚持下去,哦,你知道什么,我改变主意,回到数据库中的内容。” em.persist没有直接在数据库中放置任何东西,可能仍然“没有”。

在刷新之前尝试扔掉em.flush,你应该看到你的用户。

(你还没有说过如何配置你的会话或你如何管理交易,所以我假设所有这些都是在一次交易中。)