[此场景仅供参考]
我有一些产品,每个产品都有评论。评论有两种类型,一般评论(GC)和产品评论(PC)。
样本表
产品
ID NAME
1 APPLE
-
PRODUCT_COMMENTS
COMMENT_ID |评论| COMMENT_TYPE
1 | IPHONE很好| PC
2 | IPAD看起来很好| GC
3 |一般评论| GC
4 |产品评论| PC
假设从Product表到Product_comment表有一个外键。
我有几个类映射到这些表。
产品类和ProductComment类
产品类与ProductComment类具有一对一的关系。
public class Product {
private Long id;
private String productName;
private List<ProductComments> productComments;
private List<ProductComments> generalComments;
.....
}
现在我的问题是,有两个单独的评论列表(由comment_type区分)。
当我说
时 Product p = (Product)session.load(Product.class, new Long(1));
是否可以正确获取generalComments和productComments ?在上面的例子中
generalComments列表应包含['IPAD LOOKS GOOD','GENERAL COMMENT'],productComments列表应包含['IPHONE IS GOOD','PRODUCT COMMENT']。
应该采取什么样的映射来实现上述目标?
编辑:
我们使用Hibernate 3.0和hbm映射文件(不是注释)。
答案 0 :(得分:2)
使用@Where注释。您可以给出SQL条件来限制将选择哪些条件。在您的示例中,大致如下:
@Where(clause="COMMENT_TYPE = 'PC'")
private List<ProductComments> productComments;
@Where(clause="COMMENT_TYPE = 'GC'")
private List<ProductComments> generalComments;
请注意,此限制值是从数据库加载的,而不是写入这些列表的值。您仍然可以通过程序逻辑控制将哪种注释写入这些列表。
答案 1 :(得分:0)
在这种情况下,为了便于阅读和类型安全,我会选择使用继承。
这意味着,请创建Comment.class
GeneralComment.class
和ProductComment.class
。
您可以选择两种方式来处理层次结构:
Comment.class
值区分为另外两个实体::
Comment.class
在每个子类上:
<discriminator column="discriminator_column" type="discriminator_type" force="true|false" insert="true|false" formula="arbitrary sql expression" />
现在您的代码可能如下所示:
<subclass name="ClassName" discriminator-value="discriminator_value" proxy="ProxyInterface" lazy="true|false" dynamic-update="true|false" dynamic-insert="true|false" entity-name="EntityName" node="element-name" extends="SuperclassName"> <property .... /> ..... </subclass>
}