Я создаю приложение Spring 4 / Spring Data для существующей базы данных. Структура базы данных и данные определяются программным обеспечением с закрытым исходным кодом.
Одним из аспектов существующей системы является то, что вы можете создать комментарий к любому другому элементу в системе. Это означает, что статья, документ, мультимедийный файл (все объекты в системе) могут иметь любое количество комментариев, и каждый комментарий относится только к одному объекту в системе. Все комментарии в таблице * comment
.
Способ, которым это реализовано, состоит в том, что таблица comment
имеет столбец comment_for
, в котором содержится сцепленная / именованная / префиксная ссылка на фактическую сущность, для которой это комментарий. Похоже, что текущая система просто строит запрос соединения, добавляя к первичному ключу имя таблицы:
+----+-------------------+----------------+
| id | comment_for | comment |
+----+-------------------+----------------+
| 1| article:12345 | This is nice...|
| 2| document:42 | Cool doc! |
+----+-------------------+----------------+
В этом примере показаны два комментария: один для статьи с article.id
из 12345 и один для документа с document.id
из 42. Я создал @Entities
, сопоставляя таблицы базы данных и соответствующие интерфейсы репозитория с методами запросов Я нуждаюсь.
Я хотел бы использовать репозитории / сущности данных Spring, чтобы заполнить коллекции моих сущностей соответствующими комментариями, например (псевдокод) для статьи сущностей.
@OneToMany(mappedBy = "comment_for", prefix = "article:")
private List<Comment> comment = new ArrayList<>();
Мне нужно только однонаправленное. Мои сущности (на данный момент Article
, Document
и Mediafile
) должны хранить коллекцию своих комментариев. Мне не нужны комментарии, чтобы удерживать ссылку на сущность.
Есть ли способ сделать это? Результирующий запрос SQL должен выглядеть примерно так:
SELECT * FROM .... WHERE comment.comment_for = concat('<entityname>:', <entity>.id);
Я посмотрел на @JoinColumn
, но не могу изменить используемое значение для объединения, только имя столбца. Единственное решение, которое у меня есть на данный момент, это ручное @Query
s в интерфейсе CommentRepository, которое дает мне ArrayList всех комментариев для определенной комбинации Entity / ID. Но я хотел бы, чтобы комментарии автоматически включались как часть моей организации.
Обновление : похоже, я могу разделить пространство имен и идентификатор из comment_for
на два новых столбца, не прерывая существующее программное обеспечение. Два столбца теперь comment_for_id
и comment_for_entityname