与多个实体关联的实体

时间:2018-08-21 16:32:18

标签: java hibernate oop design-patterns

我有多个这样的实体:

Public class User{
    int age;
    .
    .
    .
    @OneToMany
    private Set<Comment> comments = new HashSet<>();
}

Public class Product{
    String name;
    .
    .
    .
    @OneToMany
    private Set<Comment> comments = new HashSet<>();
}

等等。如您所见,评论可能与用户,产品等相关联。我该如何做一个具有此类功能的Comment类?

解决方案:

  1. 我可以为每个实体使用多个Comment类,例如UserComment,ProductComment等,但是我相信有更好的方法来做到这一点。
  2. 我可以创建一个类似以下内容的Commentable类:

    Public class Commentable{
        private Set<Comment> comments = new HashSet<>();
    }
    

然后让User,Product,.. etc对其进行扩展,但这将是一个问题,因为我有多个与Comment类似的类,例如Rating,然后有Rateable等类。

我确定我缺少一个设计模式或一个面向对象的编程概念。

非常感谢

1 个答案:

答案 0 :(得分:0)

您可以拥有一个Comment类,只要它是单向的并且拥有方(负责关系的一方)是UserProduct等。这要求您拥有映射表,例如UserCommentProductComment以及comments集的一些补充。

如果注释很简单,它们也可以是可嵌入的,而直接存储在映射表中。

如果您不想使用任何映射表并希望以JPA方式进行操作,则可以使用解决方案选项1,其中CommentUserComment等的基类。您可以然后使用单个表继承策略,并为“容器”(用户,产品等)ID添加/重用列。

这样的一个缺点是您可能会在每个容器中再增加一列,或者如果您重复使用列(即该值的含义取决于区分符),则您的容器实体需要具有类型兼容的ID(例如,所有ID整数或字符串),则您可能将无法使用外键约束(除非您的数据库支持“部分”外键约束,而我所知没有db)。