【问题标题】:Duplicate Records using Bidrectional Mapping in Hibernate在 Hibernate 中使用双向映射复制记录
【发布时间】:2018-05-29 21:50:58
【问题描述】:

我想将工作人员存储在一个组织对象中,为此,我有一个组织类,为工作人员提供一对多映射。

@OneToMany(cascade=CascadeType.ALL,fetch = FetchType.EAGER)
@JoinTable(name = "ORGANIZATION_WORKER", joinColumns = { @JoinColumn(name = "orgIdPK") }, inverseJoinColumns = { @JoinColumn(name = "id") })
public Set<Worker> workerList;

“ORGANIZATION_WORKER 是一个保存映射的临时表”

然后我有一个 Worker 类,其中我有如下多对一映射。

@ManyToOne(cascade=CascadeType.ALL,fetch = FetchType.LAZY)
@JoinColumn(name = "orgIdPK")
public Organization organization;

现在,当我使用休眠会话将工作人员插入组织后保存组织时,即

session.saveOrUpdate(org);

插入查询运行两次(N+1 期)。 `

Hibernate: insert into ORGANIZATION_WORKER (orgIdPK, id) values (?, ?)
Hibernate: insert into ORGANIZATION_WORKER (orgIdPK, id) values (?, ?)

因此,当我在 rest API 上公开组织数据时,所有记录都会显示两次,因为在 rest API 上分页出错。有谁知道如何解决这个问题?

【问题讨论】:

    标签: java spring hibernate spring-data-jpa h2


    【解决方案1】:

    问题是您正在创建循环引用。您正在插入一个包含工人的组织,并且这些工人具有相同的组织作为参数,因此它插入了两次。

    为了解决这个问题,Hibernate 提供了一些适用于列的关键字:“insertable”和“updatable”,它们指定该列的值是否将在 DB 中插入或更新。

    一般来说,正确的做法是使 OneToMany 关系不可插入和不可更新;如果你想改变一个工人的组织,你可能会从那个工人那里做;负责更新该值的类是 Worker 本身,即具有 ManyToOne 关联的类。

    所以你需要这样做:

    @OneToMany(cascade=CascadeType.ALL,fetch = FetchType.EAGER, insertable=false, updatable=false)

    这样,当实体在数据库中插入或更新时,此列中的所有更改都将被忽略。

    【讨论】:

    • 我这样做了,但结果相同。你能告诉我我应该如何保存组织,比如我是否应该单独保存它们,比如单独保存工人然后单独保存组织。?
    • 我会单独保存它们,是的。我不知道您要保存的确切情况,但是假设您要保存一个同时关联了一些工作人员的新组织,您将首先将该组织插入数据库,然后将该组织插入您插入与该组织相关联的工作人员(最好在同一事务中)。如果仍有问题,能否详细说明具体情况?
    • 我通过使用自定义查询应用了一个解决方法,它允许我仅从组织表中选择组织。这样我就可以删除重复的记录。
    • 但它仍然是一个解决方法,因为插入查询仍然被执行了两次。无论如何,您的解决方案对我来说似乎是有效的。
    【解决方案2】:

    从 Worker 中移除注解。

    @ManyToOne(cascade=CascadeType.ALL,fetch = FetchType.LAZY) @JoinColumn(name = "orgIdPK")

    http://docs.jboss.org/hibernate/orm/5.3/userguide/html_single/Hibernate_User_Guide.html#collections-map-unidirectional

    【讨论】:

      猜你喜欢
      • 2016-04-19
      • 2010-10-05
      • 2019-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多