Hibernate Hierarchical映射的好习惯

时间:2017-02-25 06:15:31

标签: hibernate hibernate-mapping

我有一个分层映射问题。概念上3个元素

  1. 产品定义 - 关于产品的高级定义。产品可以是STANDARD或COMPOSITE。标准产品有一系列规格。其中,复合产品由一种或多种中间产品列表组成。一种产品可以是一种或多种COMPOSITE的一部分。因此,产品定义可以是可选的,具有与其自身的多对多关联。一种产品(STANDARD)可以是多种COMPOSITE产品的一部分,COMPOSITE产品可以包含一种或多种子产品。
  2. [约束:我必须将两种类型的产品保持为相同的实体类。最终将作为Web服务发布。因此,首选定义/模式。]

    1. 产品规格 - 产品详细说明

    2. 产品成分 - 如果产品由一种或多种中间产品构成,则保持这种关系。作文也有其他一些属性。

    3. class ProductDefinition {
      
         @ID
         private Long id;
      
         @Column(name="product_code")
         private String productCode;
      
         @Column(name="product_type")
         private String productType; // STANDARD, COMPOSITE
      
         @OneToMany(mappedBy="productDefinitionRef", cascade={CascadeType.ALL})
         private Set<ProductSpec> productSpecs;
      
         @OneToMany(mappedBy="childProductRef", cascade={CascadeType.ALL})
         private Set<ProductComposition> compositionRefs; // For a standard product, lists the composites where the product belongs to
      
         @OneToMany(mappedBy="parentProductRef", cascade={CascadeType.ALL})
         private Set<ProductComposition> childProducts;  // For a composite product, lists the proucts which are part of the composite
      
      
      
         // ... other attributes
      
      }    
      
      class ProductComposition {
      
         @ID
         private Long id;
      
         private ProductDefinition 
      
         @ManyToOne
         @JoinColumn(name="parent_prod_ref")
         private ProductDefinition parentProductRef;
      
         @ManyToOne
         @JoinColumn(name="child_prod_ref")
         private ProductDefinition childProductRef;
      
         // ... Other attributes
      
      }
      
      class ProductSpec {
      
         @ID
         private Long id;
      
      
         @ManyToOne
         @JoinColumn(name="prod_def_ref")
         private ProductDefinition productDefinitionRef;
      
         // .. other attributes
      
      
      }
      

      我期望从上述模型获得的一些样本数据:

      产品定义: -

      | ID     |  Code  | Type |  productSpecs  | compositionRefs  |  childProducts |
      
      | 1001 |    P1    | STANDARD  | [20001]     |   Empty       |   Empty |
      | 1002 |    P2    | STANDARD  | [20002]     |   [2001]      |   Empty |
      | 1003 |    P3    | STANDARD  | [20003]     |   [2001, 2002]|   Empty |
      | 1004 |    P4    | STANDARD  | [20004]     |   Empty       |   Empty |
      | 2001 |    B1    | COMPOSITE | Empty       |   Empty       | [1002]  |
      | 2002 |    B2    | COMPOSITE | Empty       |   Empty       |   [1002, 1003] |
      

      产品成分: -

      | ID    |   parentProductRef    |   childProductRef |
      | 30005 |   2001    |   1002 |
      | 30006 |   2002    |   1002 |
      | 30007 |   2002    |   1003 |
      

      问题: -

      1. 这是一种最佳的映射方式吗?请建议我们是否可以做得更好。
      2. 这种方式是在支持的产品实体中两次引用相同的组合实体吗?当我在数据库中看到数据时,我遇到了一些不一致的问题,但在我讨论之前,我想确保至少在理论上这是可行的。

0 个答案:

没有答案