2013-08-16 3 views
1

У меня есть два объекта, которые могут быть прокомментированы пользователем (скажем, например: новости и статьи). Можно ли использовать один объект Comment и привязать его к обоим объектам?JPA - привязка объекта к нескольким другим объектам

Я попробовал это, создав абстрактный суперкласс (AbstractCommentableEntity), который обрабатывает отношение к комментариям (будет CommentabeEntity1 и). Затем новости и статьи будут расширять этот класс, и было бы возможно приложить к ним комментарии. Посмотрите мое изображение, а также мой код.

Но если я реализую его так, я получаю исключение сопоставления. Я думаю, это потому, что я пытаюсь отобразить аннотированный класс @MappedSuperclass. Есть ли способ, как я могу это запустить?

enter image description here

Мой комментарий entiy будет выглядеть следующим образом:

@Entity 
public class Comment { 

    private AbstractCommentableEntity commentableEntity; 

    @ManyToOne 
    @JoinColumn 
    public AbstractCommentableEntity getCommentableEntity() { 
     return commentableEntity; 
    } 

    public void setCommentableEntity(AbstractCommentableEntity commentableEntity) { 
     this.commentableEntity = commentableEntity; 
    } 
} 

абстрактный суперкласс для commentable сущностей будет выглядеть так:

@MappedSuperclass 
public abstract class AbstractCommentableEntity { 

    Set<Comment> comments = new HashSet<Comment>(); 

    @OneToMany(mappedBy = "commentableEntity") 
    public Set<Comment> getComments() { 
     return comments; 
    } 

    public void setComments(Set<Comment> comments) { 
     this.comments = comments; 
    } 
} 

И конкретный объект будет просто расширить его например:

public class CommentabeEntity2 extends AbstractCommentableEntity{ 

} 

ответ

0

Вы не должны делать связь двунаправленной: комментарий, таким образом, будет объектом общего назначения, который может быть привязан к любому виду сущности. Объекты News и Article будут иметь коллекцию комментариев.

По умолчанию это будет отображаться с использованием двух таблиц соединений: одна ссылка Comment и News и другая, связывающая комментарий и статью.

Если вы действительно хотите, чтобы ассоциация была двунаправленной, вы можете использовать объект AbstractComment с двумя сущностями: NewsComment и ArticleComment. NewsComment будет иметь двунаправленную ассоциацию ManyToOne с News, а ArticleComment будет иметь двунаправленную ассоциацию ManyToOne с Article.

Смежные вопросы