Добавить (внешнее) отношение (тегирование) к существующим объектам Hibernate - PullRequest
0 голосов
/ 06 октября 2008

Мне нужно добавить новое отношение «многие ко многим» в существующую сущность Hibernate. Я не хочу касаться исходного объекта Hibernate или его конфигурации. Я добавляю функцию «пометки», которую можно рассматривать как внешний вклад, а не как часть данных самой организации.

Я хочу иметь простую таблицу соединений только с двумя столбцами, первичным ключом сущности и идентификатором тега.

Можно ли использовать Hibernate для управления этой таблицей, не вводя новый (искусственный) тип сущности, который содержит сопоставление с одним тегом?

Или я ошибаюсь, и мне действительно нужно иметь эту «взаимосвязь-сущность», чтобы я мог добавить атрибуты (например, временные метки) позже?

1 Ответ

1 голос
/ 06 октября 2008

Идея, лежащая в основе Hibernate, заключается в возможности обходить дерево объектов Java с заданной начальной точки. Если вы хотите определить отношение «многие ко многим» от исходного объекта к объекту тега, вы все равно можете определить его в объекте тега, и это позволит вам правильно получить список исходных объектов, имеющих этот тег.

Недостатком является то, что вы не сможете запросить исходный объект для его списка тегов (для этого потребуется аннотация, чтобы изменить отношение, и средство доступа, которое вернуло список объектов тегов). Однако вы сможете получить список оригинальных объектов, помеченных данным тегом.

Вот пример ... Давайте предположим, что помечаемый объект - это сообщение. Если это так, вот код для добавления отношения «многие ко многим» к тегу, чтобы вы могли посмотреть список сообщений, имеющих определенный тег:

@ManyToMany
@JoinTable(
    name = "TAG-POST",
    joinColumns = {@JoinColumn(name = "TAG-ID")},
    inverseJoinColumns = {@JoinColumn(name = "POST-ID")}
)
private Set<Posts> posts = new HashSet<Post>();

Как правило, вы также хотели бы иметь возможность просматривать все теги, связанные с сообщением, но вы можете не использовать обратное сопоставление. Если вам нужно обратное сопоставление, вам нужно добавить что-то вроде этого в объект Post:

@ManyToMany(mappedBy = "tags")
private Set<Tag> tags = new HashSet<Tag>();

Теперь вы также можете искать теги, связанные с сообщением.

После перечитывания вашего поста (и просмотра вашего комментария) я понимаю, что вы также заинтересованы в пропуске создания объекта Tag. Если нет ничего, кроме имени тега, вы можете использовать только описанную вами таблицу, но вам нужно немного изменить свое мышление. Что вы на самом деле описываете, так это отношения один-ко-многим между сообщением и его записями тегов. В этом случае вам необходимо сопоставить сообщение с серией записей тегов, которые имеют два столбца: POST-ID и TAG-NAME. Не изменяя исходный объект, вы все равно можете запросить в таблице список сообщений с определенным TAG-NAME или список строк TAG-NAME, связанных с конкретным сообщением.

Обратите внимание, что на самом деле это не устраняет сущность ... У вас не будет сущности Tag, но таблицу поиска «многие ко многим» придется создавать как отношение «многие к одному», что это сама сущность. Однако этот подход использует на одну таблицу меньше.

...