簡體   English   中英

JPA @ManyToMany 連接表索引

[英]JPA @ManyToMany join table indexing

Hibernate 允許通過使用@org.hibernate.annotations.Index@ManyToOne映射上添加索引。

有沒有辦法在@ManyToMany關系中為連接表指定索引?

如果實體A和實體B有一個@ManyToMany其中A是擁有方,則連接表將有一個復合索引 (a1, b1)。

我想知道這是否足夠,還是我需要創建另一個索引(b1,a1)?

在這里回答一個 6 歲的問題,但仍然相關。 我在面臨同樣的問題時遇到了這個問題。 搜索網絡使它看起來像 JPA 不支持連接表上的索引,但它確實支持,這在此處記錄

使用@JoinTable 時,您可以指定注釋上的索引,例如

@ManyToMany()
@JoinTable(name = "car_driver",
    joinColumns = @JoinColumn(name = "car_id"),
    inverseJoinColumns = @JoinColumn(name = "driver_id"),
    indexes = {
        @Index(name = "idx_car_driver_car_id", columnList = "car_id"),
        @Index(name = "idx_car_driver_driver_id", columnList = "driver_id")
    }
)
private Set<Driver> drivers;

我也在尋找這個 - 似乎是聖杯。

在這篇文章中: 如何讓 Hibernate 在外鍵 (JoinColumn) 上創建索引? 一個回答者似乎相信將 @Index 添加到集合中會在連接表上創建一個索引。 它沒有。

這篇文章: 如何使用 Hibernate 注釋在連接表上創建索引? 揭示了我逐漸相信的是可怕的事實。 這是不可能的,除非您恢復使用 hbm.xml 文件來定義您的實體(即:似乎無法使用注釋)。

因此,雖然在連接表上建立復合索引確實極大地加快了查詢速度,包括兩個 FK 列,但目前還沒有辦法使用注釋自動創建所述索引。

我現在正在研究創建一個任務,在 Hibernate 的 ExportSchema 執行之后使用它來識別連接表和創建索引。 進展不順利! 請分享您碰巧遇到的任何可行的解決方案。 我希望有人會分享他們的比較方法。

我在尋找如何控制連接表的方法時遇到了這個https://www.baeldung.com/jpa-many-to-many ,這樣我就可以至少索引其中一個鍵。

它將多對多關系分解為連接表側的多對一關系和兩個關聯實體中的每一個上的典型 OneToMany,將它們關聯到連接表,如下所示:

@Entity
class Student {

    @OneToMany(mappedBy = "student")
    Set<CourseRating> ratings;
}

@Entity
class Course {

    @OneToMany(mappedBy = "course")
    Set<CourseRating> ratings;
}

@Entity
class CourseRating {

    @ManyToOne
    @MapsId("student_id")
    @JoinColumn(name = "student_id")
    Student student;

    @ManyToOne
    @MapsId("course_id")
    @JoinColumn(name = "course_id")
    Course course;       
}

@Index 注釋可用於 CourseRating(連接表)實體中的任何字段。 在我的例子中,我在連接實體上使用了一個復合鍵,因為它的表上有讀取,所以我實際上需要拆分關系。

我希望這會有所幫助。

我想了想,我找到了解決辦法。 在多對多關系的情況下,我使用

@ManyToMany
@JoinTable(name = "core_auth_role",
    joinColumns = { @JoinColumn(name = "auth_id") },
    inverseJoinColumns = { @JoinColumn(name = "role_id") },
    uniqueConstraints = { @UniqueConstraint(columnNames = {"role_id", "auth_id" }) })
@ForeignKey(name = "fk_testkey", inverseName = "fk_testkey_inverse")
private Set<Role> roles;

結果我有兩個 idexes (auth_id, role_id) 和 (role_id, auth_id)。 Hibernate 創建的架構:

create table SOME_TABLE ( 
    ...
    primary key (auth_id, role_id),
    unique (role_id, auth_id)
);

主鍵和唯一 cosntrainst 在數據庫中自動索引。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM