2012-01-05 12 views
4

私はかなり新しいHibernateであり、hibernate-mappingに関する助けが必要です。hbm.xmlを使用して複数のクラスを1つのテーブルにマッピングする

私は1つのテーブルにマップする4つの異なるクラスを持っています。そのうちの1つのプライマリキーは、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

1つのテーブルに4つのクラスをすべて追加する理由は何ですか?彼らの見た目から、すべてのクラスはそれらの間に多対1の関係を持っています。すべてを単一のテーブルに追加すると、非常に正規化されていないテーブルが生成されます。これは、通常、リレーショナルデータベースでは悪いことです。 –

+0

これは、すべての属性をデータベースに格納する必要がなく、選択した属性のみを必要とするためです。私が望む属性は上記の表の説明で強調表示されています。私のソリューションは、 "テナント"オブジェクトとそのサブクラスをループする別のメソッドを作成し、データベースに格納したい値のみを別のクラスに統合することでした。 ClassA。その後、ClassA用のhbmファイルが作成されます。私はこれを行うには理想的ではないことを知っている、したがって、私はより最適なソリューションを探しています。 –

答えて

0

あなたはそれを止めることは何もありません。 4つのHBMを作成し、同じテーブルで異なるPojosを指します。それは@Ioan Alexandru Cucuのようにすることができますが、推奨されません。

<!-- HBM1--> 

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

    <!-- HBM2--> 

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

これはどのように動作するのか理解しようとしています。私の例を参照すると、 "CircuitReadings"リストの各 "date"、 "kva"、 "current"、 "energy"に対して同じ "circuitNo"を繰り返すことをhbmでどのように指定するのですか? –

1

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> 
関連する問題