java - JPA @ManyToMany 仅在一侧?

标签 java hibernate jpa many-to-many

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

相关文章:

Hibernate:更改子类的 DiscriminatorValue 会抛出 org.hibernate.WrongClassException

java - 执行实体管理器工厂创建语句时出现此异常

java - 使用 JavaStreams 过滤复杂列表元素 - 代码优化

java - 在java代码中找不到Android资源文件

java - JDBC 一对多连接与多选择

hibernate - 复合键另存为null

java - 使用 Hibernate 在 MySQL 中存储字节数组

java - 如何在android中使用smack api获取聊天中的离线/在线用户列表

java - 如何在 Olingo 中向元模型添加自定义属性?

java - 在 OneToMany JPA 中更新父级时正在创建新的子实体