hibernate中的一对多映射:将两个不同的属性引用到单个列

时间:2012-07-24 17:25:52

标签: java hibernate one-to-many hibernate-mapping

[此场景仅供参考]
我有一些产品,每个产品都有评论。评论有两种类型,一般评论(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映射文件(不是注释)。

2 个答案:

答案 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.classProductComment.class。 您可以选择两种方式来处理层次结构:

  1. 实际继承。每个类代表由PK连接的等效表。
  2. 对象继承。使用鉴别器列将Comment.class值区分为另外两个实体:
  3. <{1}}上的

    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>

    }