在jpa中,我现在有一些实体(Content
和Product
,但还有更多可以加入Comment
实体。
问题是我不希望在每个连接实体(Products,Contents ..)的Comment实体中都有额外的字段(和表中的列),因为这些实体将来会增加。
我发现一个半解决方案是使用单表继承并创建具体的注释类,如CommentContent
,CommentProduct
,并使用鉴别器列,但仍然保留加入实体(内容和产品)。 / p>
你有什么建议吗?
修改:
评论和内容之间的示例关系将 @MayToOne ,许多评论属于一个内容,因此对于产品..
修改2
在纯表关系模式中(没有像hibernate / jpa这样的ORM)我可以和我做这种解决方案: 添加到评论表 1-item_type 中的列和 2-item_id 女巫item_type指定其他边名表(产品,我的问题中的内容)和item_id指定表的外键它的名字是在item_type列
如何在Jpa / hibernate ORM中对此进行建模?
答案 0 :(得分:1)
您可以使用Hibernate描述您所描述的内容,如
class Content {
@OneToMany
@JoinColum(name = "item_id")
@Where("item_type = 'CONTENT'")
Set<Comment> comments;
}
class Product {
@OneToMany
@JoinColum(name = "item_id")
@Where("item_type = 'PRODUCT'")
Set<Comment> comments;
}
class Comment {
@Id
@GeneratedValue
Long id;
@Enumerated(STRING)
ItemType itemType;
Lont itemId;
}
enum ItemType {
CONTENT,
PRODUCT
}
答案 1 :(得分:0)
这是什么类型或关系?
如果是 @OneToOne
,您可以在产品和内容中放置与评论关系的信息,在评论中使用选项MappedBy来映射它们,您将跳过评论中的额外列。
如果是 @OneToMany
,您将无法在Comment中创建任何列,而是再次将信息放入“产品和内容”中,并仅在评论时使用mappedBy对此对象进行收集站点。
答案 2 :(得分:0)
您可以为即将推出的实体尝试@ManyToOne。所以这里你不需要在Comment实体(基表)中添加新列检查这个例子:https://howtoprogramwithjava.com/hibernate-manytoone-unidirectional-tutorial/