Идея, лежащая в основе 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, но таблицу поиска «многие ко многим» придется создавать как отношение «многие к одному», что это сама сущность. Однако этот подход использует на одну таблицу меньше.