Как сопоставить двунаправленные отношения JPA с участием абстрактного класса?

Предположим следующую простую схему:

Таблица сущностей – атрибуты, общие для всех сущностей.

entityId, timeCreated,...

Таблица комментариев — у некоторых объектов есть коллекция этих

entityId, commentId, commentText,....

Таблица лиц.

pensonId (entityId), firstName, lastName,...

И следующая структура наследования Java:

BaseEntity - abstract - entity, join inheritance with a discriminator
    CommentedEntity - abstract - introduces `comments` collection - mapping tbd
        Person - concrete - entity - mapping trivial

Как бы мы сопоставили двунаправленную связь между CommentedEntity и Comment? Приведенный ниже код является моей лучшей интерпретацией примеров, которые я нашел.

Комментированный объект

@OneToMany(mappedBy="owner", fetch=FetchType.EAGER)
private List<Comment> comments = new ArrayList<>();

Комментарий

@ManyToOne(fetch=FetchType.EAGER, cascade = CascadeType.ALL)
@JoinColumn(name="entityId", referencedColumnName="entityId")
private CommentedEntity owner;
  • Поскольку CommentedEntity является абстрактным классом, это не работает. owner ссылается на неизвестную сущность.
  • Создание объекта CommentedEntity потребует присвоения ему идентификатора, поэтому я не думаю, что это имеет смысл.
  • Поскольку несколько конкретных объектов будут иметь коллекцию comments, имя конкретного объекта нельзя использовать в сопоставлении.

Как бы мы тогда двунаправленно сопоставили свойство person.commentList?


person jacekn    schedule 31.03.2016    source источник
comment
У вас есть OneToMany в Person для ввода Comment, но вы не знаете, что это за тип. У вас есть ManyToOne из CommentedEntity в CommentedEntity?! (вы имеете в виду Person?) Пока типы полей согласованы и сохраняемы (Entity или MappedSuperclass), вы должны быть в состоянии сделать это (или, по крайней мере, я могу с реализацией, которую я использую ) например, datanucleus.org/products/accessplatform_4_2/jpa/orm /   -  person Neil Stockton    schedule 31.03.2016
comment
Извини, Нил. Мне нужно было сделать гораздо более простой пример, и я сделал ошибку. Вопрос касается двунаправленного сопоставления между CommentedEntity и Comment. Person не используется, так как унаследует это сопоставление от своего родителя. Извините за путаницу.   -  person jacekn    schedule 31.03.2016
comment
Я посмотрел ссылку, которую вы предоставили. Мой случай такой же, как учетная запись/адрес с FK. Там, где вы используете конкретное Account, мне нужно поставить абстрактное CommentedEntity.   -  person jacekn    schedule 31.03.2016
comment
Хорошо, и это то, что работает для меня с реализацией, которую я использую. Так что же происходит, когда вы это делаете? (точное исключение + трассировка стека? или результат)   -  person Neil Stockton    schedule 31.03.2016
comment
CommentedEntity — неизвестная сущность. Это исключение, и это имеет смысл, поскольку оно не отображается как сущность. Это всего лишь промежуточный абстрактный класс.   -  person jacekn    schedule 31.03.2016


Ответы (1)


Если Person расширяет CommentedEntity, то вам не понадобится CommentedEntity owner для сущности Person, потому что Person is part of aCommentedEntity`. Другими словами, нет необходимости в поле владельца, поскольку Person является CommentedEntity.

person K.Nicholas    schedule 31.03.2016
comment
Но для двунаправленного отображения требуется владелец. mappedBy="owner". Можете ли вы привести пример того, как вы бы отобразили это? - person jacekn; 31.03.2016
comment
Нет двунаправленного отображения, как вы его описываете. Это всего лишь одна сущность, Person, которая является подклассом CommentedEntity, который является подклассом BaseEntity. Что это за коллекция Persons? - person K.Nicholas; 31.03.2016