【问题标题】:one to many mapping in hibernate : Referring two different properties to a single columnhibernate 中的一对多映射:将两个不同的属性引用到单个列
【发布时间】:2012-07-24 17:25:52
【问题描述】:

[此场景用于说明]
我有一些产品,每个产品都可以有cmets。评论有两种类型,general cmets(GC)和product cmets(PC)。

示例表

产品

ID 名称


1 个苹果

--

PRODUCT_COMMENTS

COMMENT_ID |评论 | COMMENT_TYPE


1 | IPHONE 不错 |电脑

2 | IPAD 看起来不错 |GC

3 |一般评论|气相色谱

4 |产品评论|PC

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

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

Product 类和 ProductComment 类

Product 类与 ProductComment 类具有一对一的关系。

  public class Product {
     private Long id;

     private String productName;

     private List<ProductComments> productComments;

     private List<ProductComments> generalComments;

    .....

   }

现在我的问题是,有两个单独的 cmets 列表(由 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 映射文件(不是注释)。

【问题讨论】:

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


    【解决方案1】:

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

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

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

    【讨论】:

    • 我们使用hbm映射文件。 @where 的等效项是否可用于 xml 映射?我们使用 Hibernate 3.0
    • 尝试查看休眠文档。我相信这是映射中“列表”元素的“位置”属性。
    【解决方案2】:

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

    1. 实际继承。每个类代表一个由 PK 连接的等效表。
    2. 对象继承。使用鉴别器列将 Comment.class 值区分为其他两个实体:

    在Comment.class:

    &lt;discriminator column="discriminator_column" type="discriminator_type" force="true|false" insert="true|false" formula="arbitrary sql expression" /&gt;

    在每个子类上:

    &lt;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"&gt; &lt;property .... /&gt; ..... &lt;/subclass&gt;

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

    public class Product {
     private Long id;
    
     private String productName;
    
     private List<ProductComments> productComments;
    
     private List<GeneralComments> generalComments;
    
    .....
    

    }

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      相关资源
      最近更新 更多