2009-06-05 9 views
1

hibernateを使用してオブジェクトの階層を含めることはできますが、discriminator列はサブクラス型を定義するCODEを含む別のテーブルの外部キーです。階層ごとのHibernateテーブル方法

結合されたテーブルのコードを弁別者として指定することはできますか、またはキー値を使用する必要がありますか?

discriminator = "square | circle" v.s.弁別= "0 | 1"

テーブル:形状

area=25 shape_type_fk=0 
area=10 shape_type_fk=1 

表:あなたはサブクラスの代わりに結合されたサブクラスを使用する必要があるようshape_types

ID CODE 
0 square 
1 circle 

答えて

1

簡単なテストは、あなたがこれを行うことができることを示しています

<?xml version="1.0"?> 
<!DOCTYPE hibernate-mapping PUBLIC 
    "-//Hibernate/Hibernate Mapping DTD 3.0//EN" 
    "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> 
<hibernate-mapping default-access="field"> 

    <class name="Shape" abstract="true"> 
    <id name="id"/> 
    <discriminator formula="select CODE from SHAPE_TYPES st where st.ID=SHAPE_TYPE"/> 
    <version name="version"/> 

    <subclass name="Square" discriminator-value="square"/> 
    <subclass name="Circle" discriminator-value="circle"/> 

    </class> 
</hibernate-mapping> 

今、このマッピングは、式で参照されているSHARE_TYPEテーブルを作成することはありませんまた、それがSHAPEテーブルにSHAPE_TYPE列を追加ありません。これは、import.sqlファイルで行うことができます.Hibernateはクラスパスから自動的に読み込みます。あるいは、別のクラスをこのテーブルにマッピングすることもできます。

+0

Maartenの例では動作しますが、ディスクリミネータの数式を括弧でくくる必要があり、サブセレクトの列はエイリアステーブルを参照する必要があります。また、サブクラスの基準を使用すると相関サブクエリが発生しますが、これは非常に非効率的です。私は多相(テーブルごと)の階層なしで生きなければならないと思う。 – gbegley

関連する問題