【问题标题】:Hibernate mapping multiple classes to one table using hbm.xmlHibernate 使用 hbm.xml 将多个类映射到一张表
【发布时间】:2012-02-03 01:21:29
【问题描述】:

我对 Hibernate 还很陌生,需要一些有关 hibernate 映射的帮助。

我有 4 个不同的类,我想将它们映射到一个表中,其中主键由来自 2 个不同类的属性组成。同时,我只想将每个类中选定的属性映射到本地数据库中。我希望避免使用 JPA 注释,而是在 hbm.xml 文件中定义映射样式。我该怎么做?

举个例子:

public class Tenant implements Serializable {
    private final static long serialVersionUID = 1L;
    protected List<Rack> rack;
    protected String type;
    //getters setters
}

public class Rack implements Serializable {
    private final static long serialVersionUID = 1L;        
    protected List<Circuit> circuit;
    protected String rackLabel;
    protected Boolean excludes;
    //getters setters
}

public class Circuit implements Serializable {
    private final static long serialVersionUID = 1L;
    protected List<CircuitReadings> circuitReadings;
    protected String circuitNo;
    protected Boolean excludes;
    //getters setters
}

public class CircuitReadings
    implements Serializable {
    private final static long serialVersionUID = 1L;
    protected String date;
    protected String kva;
    protected String current;
    protected String kwh;
    //getters setters
}

最终的表格应包含以下内容:

    type | rackLabel | circuitNo | date | kva | current | energy

上面的“circuitNo”和“date”应该构成复合主键。

有人可以给我举个例子来说明我应该如何映射它吗?谢谢!

【问题讨论】:

  • 为什么要在一个表中添加所有四个类?从它们的外观来看,所有类之间都有多对一的关系。将它们全部添加到一个表中会产生一个非常非规范化的表。这在关系数据库中通常是一件坏事。
  • 这是因为我不想将所有属性都存储到数据库中,而只想要选定的属性。我想要的属性在上面的表格描述中突出显示。我的解决方案是创建一个单独的方法,循环遍历“租户”对象及其子类,并将我想要存储到数据库中的值合并到一个单独的类中,例如A类。然后为 ClassA 创建一个 hbm 文件。我知道这样做并不理想,因此,我正在寻找更优化的解决方案。

标签: java hibernate jakarta-ee mapping hibernate-mapping


【解决方案1】:

没有什么能阻止你这样做。创建 4 个 HBM 指向同一张表但不同的 Pojos 。虽然可以,但作为@Ioan Alexandru Cucu,不推荐。

   <!-- HBM1-->

<class name="com.myProject.Rack"
    table="My_Table">

   <!-- HBM2-->

   <class name="com.myProject.Rack"
    table="My_Table">

【讨论】:

  • 我试图了解这将如何工作。回顾我的示例,如何在 hbm 中指定要为“CircuitReadings”列表中的每个“日期”、“kva”、“电流”和“能量”重复相同的“电路编号”?
【解决方案2】:

Hibernate 提供了一种使用 discriminator 关键字映射子类的方法。

<class name="Payment" table="PAYMENT">
    <id name="id" type="long" column="PAYMENT_ID">
        <generator class="native"/>
    </id>
    <discriminator column="PAYMENT_TYPE" type="string"/>
    <property name="amount" column="AMOUNT"/>
    ...
    <subclass name="CreditCardPayment" discriminator-value="CREDIT">
        <join table="CREDIT_PAYMENT">
            <key column="PAYMENT_ID"/>
            <property name="creditCardType" column="CCTYPE"/>
            ...
        </join>
    </subclass>
    <subclass name="CashPayment" discriminator-value="CASH">
        <join table="CASH_PAYMENT">
            <key column="PAYMENT_ID"/>
            ...
        </join>
    </subclass>
    <subclass name="ChequePayment" discriminator-value="CHEQUE">
        <join table="CHEQUE_PAYMENT" fetch="select">
            <key column="PAYMENT_ID"/>
            ...
        </join>
    </subclass>
</class>

【讨论】:

    猜你喜欢
    • 2014-01-15
    • 1970-01-01
    • 2013-08-20
    • 2014-12-12
    • 2010-12-12
    • 2019-11-14
    • 2017-02-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多