我有多个这样的实体:
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类?
解决方案:
我可以创建一个类似以下内容的Commentable类:
Public class Commentable{
private Set<Comment> comments = new HashSet<>();
}
然后让User,Product,.. etc对其进行扩展,但这将是一个问题,因为我有多个与Comment类似的类,例如Rating,然后有Rateable等类。
我确定我缺少一个设计模式或一个面向对象的编程概念。
非常感谢
答案 0 :(得分:0)
您可以拥有一个Comment
类,只要它是单向的并且拥有方(负责关系的一方)是User
,Product
等。这要求您拥有映射表,例如UserComment
和ProductComment
以及comments
集的一些补充。
如果注释很简单,它们也可以是可嵌入的,而直接存储在映射表中。
如果您不想使用任何映射表并希望以JPA方式进行操作,则可以使用解决方案选项1,其中Comment
是UserComment
等的基类。您可以然后使用单个表继承策略,并为“容器”(用户,产品等)ID添加/重用列。
这样的一个缺点是您可能会在每个容器中再增加一列,或者如果您重复使用列(即该值的含义取决于区分符),则您的容器实体需要具有类型兼容的ID(例如,所有ID整数或字符串),则您可能将无法使用外键约束(除非您的数据库支持“部分”外键约束,而我所知没有db)。