2012-01-05 108 views
4

我对Hibernate相当陌生,需要一些Hibernate映射的帮助。Hibernate使用hbm.xml将多个类映射到一个表

我有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”和“日期”应形成复合主键。

有人可以告诉我如何映射这个例子吗?谢谢!

+1

为什么要在一个表中添加所有四个类?从他们看的方式来看,所有班级之间都有多对一的关系。将它们全部添加到单个表格中将产生非标准化的表格。这在关系数据库中通常是一件坏事。 – 2012-01-05 07:07:44

+0

这是因为我不想将所有属性存储到数据库,并且只需要选定的属性。我想要的属性在上面的表格描述中突出显示。我的解决方案是创建一个单独的方法,循环访问“Tenant”对象及其子类,并仅将要存储到数据库中的值合并到独立的类中,例如ClassA的。然后为ClassA创建一个hbm文件。我知道这样做并不理想,因此,我正在寻找更优化的解决方案。 – 2012-01-13 07:25:53

回答

0

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

<!-- HBM1--> 

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

    <!-- HBM2--> 

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

我试图理解这将如何工作。回过头来看我的例子,我如何在hbm中指定我想为“CircuitReadings”列表中的每个“日期”,“kva”,“当前”和“能量”重复相同的“circuitNo”? – 2012-01-13 07:32:41

1

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

<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>