Предположим следующую простую схему:
Таблица сущностей – атрибуты, общие для всех сущностей.
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?
CommentedEntity
иComment
.Person
не используется, так как унаследует это сопоставление от своего родителя. Извините за путаницу. - person jacekn   schedule 31.03.2016Account
, мне нужно поставить абстрактноеCommentedEntity
. - person jacekn   schedule 31.03.2016CommentedEntity
— неизвестная сущность. Это исключение, и это имеет смысл, поскольку оно не отображается как сущность. Это всего лишь промежуточный абстрактный класс. - person jacekn   schedule 31.03.2016