Hibernate / JPA отношения многие ко многим через таблицу соединений и составной ключ - PullRequest
5 голосов
/ 10 февраля 2012

Итак, я задал этот вопрос вчера, но посты цели изменились, и вопрос другой:

Hibernate / JPA Коллекция элементов со многими ко многим?

Я хочу знать, возможно ли создавать объекты, которые будут моделировать мои необходимые отношения, чтобы Hibernate создавал мою схему при запуске приложения.

Отношения, которые я хочу, выглядят так:

1 http://a8.sphotos.ak.fbcdn.net/hphotos-ak-ash4/417593_10150594114269218_505554217_8657377_1475865815_n.jpg

Дело в том, что таблица Join может содержать строки, которые не связаны ни с какими элементами. Структура представляет классификацию элементов на основе пары «тип» и «значение» и вводится в систему за пределами этого конкретного приложения.

То, что я хотел бы сделать, - это настроить мою Элементную Hibernate Entity так, чтобы она содержала список категорий посредством сопоставления, чтобы я мог фактически видеть, к каким категориям принадлежит мой элемент AND, так что Hibernate создает таблицу для меня. .

Вот что у меня получилось: сопоставить это в моем классе Element Entity следующим образом:

@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(name = "ELEMENT_ELEMENTCATOGORY", joinColumns = {
        @JoinColumn(name = "type", referencedColumnName = "type"),
        @JoinColumn(name = "value", referencedColumnName = "value") })
@Column(name = "category")
public List<ElementCategory> getCategories() {
    return categories;
}

Это делает большую часть того, что я хочу, он создает мои таблицы, как указано выше, именно так, как я хочу, чтобы они исключали одну вещь, в таблицу элементов добавлена ​​уникальная зависимость в паре (тип, значение). Я не хочу этого, потому что несколько элементов могут иметь одинаковую пару типа и значения, мне нужно иметь возможность остановить создание уникального ограничения с самого начала, но не могу понять, как с текущим отображением я могу это сделать? Я упускаю суть отношения «многие ко многим»?

1 Ответ

1 голос
/ 11 февраля 2012

На самом деле вполне логично, что Hibernate накладывает уникальное ограничение на столбец типа и значения.

В сопоставлении @ManyToMany вы говорите, что в объединяемой таблице столбцы соединения - это столбец типа и значения. В общем, вы говорите, что hibernate должен определять, какой элемент связан с ElementCategory по свойству value и type. поэтому комбинация этих двух свойств должна быть уникальной. В противном случае hibernate не будет знать, какой элемент принадлежит какому элементу ElementType

Если вы хотите, чтобы несколько сущностей Element могли быть связаны с множеством сущностей ElementType, а комбинация типа и значения не всегда уникальна, вы не можете использовать эти свойства в качестве joincolumns

...