gpt4 book ai didi

java - Hibernate ManyToMany 结果为笛卡尔积

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:46:31 24 4
gpt4 key购买 nike

我是 hibernate/JPA 的新手,对于这个菜鸟问题深表歉意。我在实体中有以下关系

  • Manager与Worker有多对多关系
  • Worker 与 Task 存在多对多关系

以下是ERD

enter image description here

以下是我的java类

@Entity
@table(name="manager")
public class Manager {

private long id;

private String name;

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "manager_worker", joinColumns = { @JoinColumn(name = "manager_id") },
inverseJoinColumns = { @JoinColumn(name = "worker_id") })
private ArrayList<Worker> workers = new ArrayList<Worker>();

// ......getter setter
}

@Entity
@Table(name = "worker")
public class Worker {

@Id
private long id;

private String name;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "worker_task", joinColumns = { @JoinColumn(name = "worker_id") },
inverseJoinColumns = { @JoinColumn(name = "task_id") })
private ArrayList<Task> tasks = new ArrayList<Task>();
...........................
}

@Entity
@Table(name = "task")
public class Task {

@Id
private long id;

private String title;
.................
}

我有以下数据:

  • 经理 M1 有 worker W1 和 W2
  • W1 有任务 TW1、TW2、TW3
  • W2 有任务 TW2 和 TW2

当我获得 ID M1 的 Manager 对象时,结果具有 Worker 和 Task 的笛卡尔积,即 W1 数据重复 3 次,W2 数据重复 2 次,即 Manager.worker 数组列表有 5 个 worker 对象而不是 2 个.

我使用 Session.get() 方法加载数据

public E find(final K key) {
return (E) currentSession().get(daoType, key);
}

谁能告诉我如何解决这个问题,并指出我在这种情况下应该使用的最佳做法。

谢谢

最佳答案

发生这种情况是因为 @ManyToMany 关系都是预先加载的。

这将导致对所有三个表进行外部连接。该查询的结果是五行,其中 W1 出现了三次,W2 出现了两次。到目前为止一切都是正确的。

但出于某种原因,Hibernate 只是将所有 worker 放入集合中,即使它们是重复的。它甚至在 FAQ 中有描述.

有多种方法可以解决这个问题:

  • 将其中一个关系更改为延迟加载
  • 使用 Set 而不是 List(您不应该使用 ArrayList 作为变量的类型,尤其是在使用 Hibernate 时)
  • 任务使用@Fetch(FetchMode.SELECT)

关于java - Hibernate ManyToMany 结果为笛卡尔积,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24857078/

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