JPA @ManyToMany联接表索引

kma*_*oor 7 sql database optimization hibernate jpa

Hibernate允许使用来通过@ManyToOne映射添加索引@org.hibernate.annotations.Index

有没有一种方法可以为@ManyToMany关系中的连接表指定索引?

如果Entity A和Entity 的拥有方B@ManyToManywith A,则联接表将具有复合索引(a1,b1)。

我想知道这是否足够,还是需要创建另一个索引(b1,a1)?

ndt*_*viv 7

我也在寻找这个 - 似乎是圣杯。

在这篇文章中: 如何让 Hibernate 在外键 (JoinColumn) 上创建索引?一个回答者似乎相信将 @Index 添加到集合中会在连接表上创建一个索引。它没有。

这篇文章: 如何使用 Hibernate 注释在连接表上创建索引?揭示了我逐渐相信的是可怕的事实。这是不可能的,除非您恢复使用 hbm.xml 文件来定义您的实体(即:似乎无法使用注释)。

因此,虽然在连接表上建立复合索引确实极大地加快了查询速度,包括两个 FK 列,但目前还没有办法使用注释自动创建所述索引。

我现在正在研究创建一个任务,在 Hibernate 的 ExportSchema 执行之后使用它来识别连接表和创建索引。进展不顺利!请分享您碰巧遇到的任何可行的解决方案。我希望有人会分享他们的比较方法。


小智 6

在这里回答一个6岁的问题,但仍然很重要。我在面对同一问题时遇到了这个问题。搜索Web使其看起来好像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;
Run Code Online (Sandbox Code Playgroud)