【问题标题】:ManyToMany Relation in JPA with Index possible?JPA中与索引的多对多关系可能吗?
【发布时间】:2018-02-12 02:04:02
【问题描述】:

我想在与实体之间建立多对多关系,我现在在 MySql 端使用联结表。现在我需要一个 JPA 解决方案,比如一个索引,它允许我使用这两个表/实体的 id 作为键/索引,而不需要实体本身,以避免一些跨包引用。查询时我有 EntityA 的 ID 并想用它找到 EntityB 的 ID,仅此而已。这就是我认为它可能工作的方式: (这不是因为我没有 JunctionEntity 的 ID,如果我使用 ID,那么当唯一唯一的东西应该是两个条目在一起时,显然条目必须是唯一的。PK 类也不起作用,因为它会仍然需要对两个实体的上述引用)

实体A:

@Entity
@Table(name = "EntityA")
})
public class EntityA {
    @Id
    private int id;

}

实体B:

@Entity
@Table(name = "EntityB")
})
public class EntityB {
    @Id
    private int id;

}

JunctionEntity:

@Entity
@Table(name = "junction", indexes = {
        @Index(name = "ix_a_b", columnList = "a_id, b_id")
})
public class JunctionEntity {
    private int a_id;
    private int b_id;
}

用于连接表的 MySQL:

CREATE TABLE junction (
  a_id   INT         NOT NULL,
  b_id   INT         NOT NULL,
  CONSTRAINT junction_fk_a FOREIGN KEY (a_id) REFERENCES entityA (id),
  CONSTRAINT junction_fk_b FOREIGN KEY (b_id) REFERENCES entityB (id)
);

CREATE UNIQUE INDEX ix_a_b
  ON junction (a_id, b_id);

【问题讨论】:

  • 为什么要映射连接表?你想达到什么目的? 我有EntityA的ID,想用它找到EntityB的ID:什么意思?这是一个很多*到**很多。因此,许多 B 与给定的 A 相关联。但无论如何,可以使用简单的 JPQL 查询来查找与给定 A ID 关联的所有 B ID。
  • 这里少了一个“s”,令人困惑。我猜一个带有“填充 id”的 JPQL 查询,正如 Abhilekh 建议的那样:)

标签: java mysql hibernate jpa spring-data


【解决方案1】:

您可以添加主键并使用 a_id、b_id 或两者在联结表中进行搜索。

CREATE TABLE junction (
  id     INT          NOT NULL,
  a_id   INT         NOT NULL,
  b_id   INT         NOT NULL,
  CONSTRAINT junction_fk_a FOREIGN KEY (a_id) REFERENCES entityA (id),
  CONSTRAINT junction_fk_b FOREIGN KEY (b_id) REFERENCES entityB (id)
);

您不需要知道联结表的 id。您可以像这样查询路口:

select b_id from junction where a_id = ?;

【讨论】:

  • 哈,我没想过简单地添加一个没有其他目的的 id 来让 jpa 开心,但这应该可以,谢谢!
猜你喜欢
  • 2016-06-03
  • 2021-05-25
  • 2015-12-13
  • 2015-12-23
  • 2020-11-26
  • 1970-01-01
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多