必须在Hibernate中将哪些表定义为被识别的实体?

时间:2010-07-08 12:38:38

标签: hibernate

我想开发一个博客和图片库系统。我的db模式如下所示;

IMAGE {table} | 文章{table} |的 COMMENT {表}
------------------- | ------------------------ | ----- ------------------
PK id; | PK id; | PK id;
PATH String; | FULLTEXT字符串| ENTITY_ID {IMAGE_ID,ARTICLE_ID}
| | ENTITY_TYPE枚举{IMAGE,ARTICLE,COMMENT}

LIKES {表}
-------------------------------------------------- ---------------- |
PK id; |
ENTITY_ID {IMAGE_ID,ARTICLE_ID} |
ENTITY_TYPE枚号{IMAGE,ARTICLE,COMMENT} |

那么我该如何创建模型呢?我认为必须定义受歧视的实体,但必须定义哪些实体;实体:子类{IMAGE,ARTICLE}或注释:SubClasses {ArticleComment,ImageComment} / Like:SubClasses {ImageLike,ArticleLike}?

2 个答案:

答案 0 :(得分:0)

在采用每层次表策略时,可以使用鉴别器列来实现不同的实体子类。它们使用单​​个表,其中包含表中每个字段的所有列。

继续这条路线:

所以,如果你有一个Image和一个Article是某个共享实体的子类,也许是一个PostObject,那么你的表就是这样的:

POST_OBJECT [Table]
-------------------
id
POST_TYPE (this is the discriminator column, defined as IMAGE, ARTICLE, COMMENT)
COMMENT_ID
PATH
FULLTEXT
... 

LIKES [Table] 
-------------------
id
POST_OBJECT_ID_fk

然后,您可以在COMMENT表中拥有POST_OBJECT ID的外键。

我会提醒您适当考虑您的实体关系。你上面的内容最有可能导致Comment,Article,Image和Like对象。

您所展示的内容更类似于每个混凝土类别的表格。 Pro:更多标准化布局Con:更多连接

我建议查看Hibernate文档,了解各自的优缺点,以便做出更明智的决定:http://docs.jboss.org/hibernate/core/3.5/reference/en/html/inheritance.html#inheritance-tableperclass

答案 1 :(得分:0)

对特殊情况使用任何注释解决了我需要的问题(How to use Hibernate @Any-related annotations?)。但它不支持双向映射。我很难使用映射而不是继承。(How can I do bi-directional mapping over @Any annotated property?