gpt4 book ai didi

java - 在 Hibernate 中使用双向映射重复记录

转载 作者:行者123 更新时间:2023-12-01 19:53:07 25 4
gpt4 key购买 nike

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

@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;

现在,当我使用 hibernate session 将工作人员插入组织后保存组织时,即

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 上的分页出现错误。有谁知道如何解决这个问题吗?

最佳答案

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

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

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

所以你需要这样做:

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

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

关于java - 在 Hibernate 中使用双向映射重复记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50593485/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com