2009-11-25 47 views
2

我们必须为只读目的的lecagy数据库中包含以下结构:Hibernate映射条件多到一

Table MAIN: 
id productId productType 

Table PRODUCT_A: 
id description_a 

Table PRODUCT_B: 
id description_b 

Table PRODUCT_C: 
id description_c 

根据在列productTyp价值,产品ID是指无论对PRODUCT_A,PRODUCT_B或PRODUCT_C。

对于每个表我创建一个Java实体。 Main类包含每个产品的一个集合。

产品与主类不是'是'的关系。在其他情况下作为独立实体使用。

有什么办法可以用hbm.xml文件来映射这个吗?

+0

为什么.hbm.xml?你不能使用注释吗? – Bozho 2009-11-25 14:45:46

+0

没有。但它不应该有任何区别 – bertolami 2009-11-25 14:59:01

回答

2

映射正确的方法是通过<any>

<class name="Main" table="MAIN"> 
    ... 
    <any name="product" id-type="long" meta-type="string"> 
    <meta-value value="PRODUCT_A" class="ProductA"/> 
    <meta-value value="PRODUCT_B" class="ProductB"/> 
    <meta-value value="PRODUCT_C" class="ProductC"/> 
    <column name="productType"/> 
    <column name="productId"/> 
    </any> 
</class> 

你必须适当ProductA等..类映射到相应的表(也许你已经有了)。

3

看起来你正在寻找使用每个子类策略使用鉴别器的表继承。在Java中,每个PRODUCT_X类应该扩展Main类。 This page解释了实施该策略的细节。

+0

在我看来,我也可以使用继承,但产品类远没有与主 – bertolami 2009-11-25 14:17:07

+0

有'是'关系请记住,您在这里没有进行OO设计,而是您找到映射现有表格的最有效方法。如果你有重新设计表结构的奢望,那么我会关心继承是否是最好的解决方案。但既然如此,情况并非如此。不幸的是,为了完成工作,我们必须妥协一点。 – 2009-11-25 14:23:41

+0

同意。但由于还有很多其他表格,我仍然犹豫不决。 – bertolami 2009-11-25 14:59:39