JPA @ManyToMany индексация таблицы соединений - PullRequest
6 голосов
/ 07 декабря 2011

Hibernate позволяет добавлять индексы на @ManyToOne отображениях с использованием @org.hibernate.annotations.Index.

Есть ли способ указать индекс для таблицы соединений в отношении @ManyToMany?

Если Entity A и Entity B имеют @ManyToMany, где A является стороной-владельцем, таблица соединения будет иметь составной индекс (a1, b1).

Интересно, достаточно ли этого или мне нужно создать другой индекс (b1, a1)?

Ответы [ 3 ]

4 голосов
/ 19 декабря 2017

Ответ на 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;
4 голосов
/ 04 января 2012

Я тоже ищу это - кажется, Святой Грааль.

В этом посте: Как я могу попросить Hibernate создать индекс по внешнему ключу (JoinColumn)? кажется, что ответчик полагает, что добавление @Index в коллекцию создает индекс в таблице соединений. Это не так.

Это сообщение: Как мне создать индекс для таблиц объединения, используя аннотации Hibernate? показывает, что я постепенно начинаю верить, что это ужасная правда. Это невозможно, если вы не вернетесь к использованию файла hbm.xml для определения ваших сущностей (то есть: кажется, что это невозможно с использованием аннотаций).

Так что, несмотря на это, он чрезвычайно ускоряет запросы, чтобы иметь составной индекс для таблиц соединения, охватывающий оба столбца FK, но в настоящее время нет способа автоматически создать указанный индекс с использованием аннотаций.

Сейчас я изучаю создание задачи, которая будет использоваться после выполнения ExportSchema в Hibernate для идентификации таблиц соединений и создания индексов. Это не очень хорошо! Пожалуйста, поделитесь любыми жизнеспособными решениями, с которыми вы можете столкнуться. Я надеюсь, что кто-то поделится своим подходом для сравнения.

0 голосов
/ 28 июня 2013

Я думал об этом, и я нашел решение. В случае отношения многих ко многим я использовал

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

В результате у меня есть два idex (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 автоматически индексируются в базе данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...