0

【这个场景是为了说明】
我有一些产品,每个产品都可以有评论。评论有两种类型,一般评论(GC)和产品评论(PC)。

样品表

产品

身份证名称


1个苹果

--

PRODUCT_COMMENTS

COMMENT_ID | 评论 | COMMENT_TYPE


1 | IPHONE 不错 | 个人电脑

2 | IPAD 看起来不错 |GC

3 | 一般评论| GC

4 | 产品评论 |PC

假设 Product 表到 Product_comment 表有一个外键。

我有几个类映射到这些表。

产品类和 ProductComment 类

Product 类与 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 映射文件(不是注释)。

4

2 回答 2

2

使用@Where注释。您可以提供 SQL 条件来限制将选择哪些条件。在您的示例中,大致如下:

@Where(clause="COMMENT_TYPE = 'PC'")
private List<ProductComments> productComments;

@Where(clause="COMMENT_TYPE = 'GC'")
 private List<ProductComments> generalComments;

请注意,此限制值是从数据库加载的,而不是写入这些列表的值。您仍然可以通过程序逻辑控制将哪种注释写入这些列表。

于 2012-07-24T17:35:07.437 回答
0

在这种情况下,为了可读性和类型安全,我会选择使用继承。这意味着,创建Comment.class GeneralComment.classProductComment.class. 您可以选择 2 种方式来处理层次结构:

  1. 实际继承。每个类代表一个由 PK 连接的等效表。
  2. 对象继承。使用鉴别器列将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>

现在您的代码可能如下所示:

public class Product {
 private Long id;

 private String productName;

 private List<ProductComments> productComments;

 private List<GeneralComments> generalComments;

.....

}

于 2012-07-27T07:39:26.250 回答