Как сопоставить коллекцию «один ко многим» с таблицей соединений, используя дискриминатор - PullRequest
0 голосов
/ 22 июня 2011

Я пытаюсь реализовать базовую систему тегов в спящем режиме. Проблема заключается в том, что все делали теги на подклассы, чтобы упростить отображение. Я хочу, чтобы мой объект Tag не зависел от того, как он используется. Это никогда не должно быть определенным для типа. Однако картирование оказалось очень сложным. Вот что я пытаюсь сделать.

Я начинаю с двух классов Tag и Prefix. Префикс будет содержать коллекцию тегов. У меня есть 3 таблицы. префикс, теги и tagged, где tagged - это таблица, объединяющая префикс и теги. Перечисление перечисляет другие объекты, которые я буду отмечать. Вот как я хочу поддерживать разные типы.

Это выглядит так:

CREATE TABLE tagged(
tag_id INT(11) NOT NULL,
object_id INT(11) NOT NULL,
discriminator ENUM('PREFIX', 'ROOT', 'SUFFIX') 
) ENGINE=INNODB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

В основе моего отображения лежит отображение один-ко-многим

@OneToMany
@JoinTable(name = "tagged", joinColumns = { @JoinColumn(name = "object_id") }, inverseJoinColumns = @JoinColumn(name = "id"))
public List<Tag> getTags() {
    return tags;
}

Итак, вопрос в том, как мне присоединиться к таблице дискриминатора и установить для нее значение? Я изначально пробовал:

@OneToMany
@JoinTable(name = "tagged", joinColumns = @JoinColumn(name = "object_id"), inverseJoinColumns = @JoinColumn(name = "id"))
@Where(clause = "discriminator='PREFIX'")
public List<Tag> getTags() {
    return tags;
}

Это не сработало. Hibernate искал в таблице тегов дискриминатор. Есть идеи? Спасибо!

1 Ответ

1 голос
/ 22 июня 2011

Вы пытались использовать аннотацию WhereJoinTable ?Учитывая его документацию, он должен делать то, что вы хотите.

...