2009-07-14 6 views
8

休止状態では、クラスのマッピングを列挙型のセットに定義できますか?Hibernateで列挙型のセットをマップするには?

私は、セットのマッピングを定義する方法の例を見つけられました。私はEnumをマップする方法の例を個別に見つけることができましたが、クラスのEnumを定義する方法を理解できません。

誰でも私に例を教えてください。

これは既存のアプリケーションの上に構築されているため、データベーススキーマを変更することはできません。

これは私がモデル化したい関係です。 Wicketは通常のクラスで、WicketTypeはJava Enumです。

+----------------+ +------------+ +------------+ 
| Wicket   | | Ref Table | | WicketType | 
+----------------+ +------------+ +------------+ 
| INT  | W_ID | |   | | W_TypeId | 
| .... |  | FK | W_ID  | FK | WicketType | 
| INT  | TYPE |----| W_TypeId |----|   | 
+----------------+ +------------+ +------------+ 

おかげで再び

+0

であるあなたが例を提供してもらえますか? –

答えて

2

thisは何が必要ないのか?

ちらつきの初期応答を詳述するために、参照はenumの序数を使用して列挙をマップする手段を提供します。

この場合、実際には見た目よりも簡単です。列挙型をホストしているため、WicketTypeのアクセサーをIntEnumUserTypeのサブタイプに指定する必要があります。スーパータイプはマッピングを処理しますインスタンスの序数

package test; 

public class WicketTypeState extends IntEnumUserType<WicketType> { 
    private WicketType wicketType; 

public WicketTypeState() { 
    // we must give the values of the enum to the parent. 
    super(WicketType.class, WicketType.values()); 
} 

    public WicketType getWicketType() { 
     return wicketType; 
    } 

    public void setWicketType(final WicketType wicketType) { 
     this.wicketType = wicketType; 
    } 
} 

列挙テーブルのマッピングを定義します、列挙型のセットでタイプに続いて

<hibernate-mapping package="test"> 
    <class name="Wicket" table="Wicket"> 
    <id name="id" column="ID"/> 
    <set name="wicketTypes" table="WicketType" inverse="true"> 
     <key column="ID"/> 
     <one-to-many class="test.WicketTypeState"/> 
    </set> 
    </class> 
</hibernate-mapping> 

そのプロパティのセットマッピングを定義します。

<hibernate-mapping package="test"> 
    <class name="WicketTypeState" lazy="true" table="WicketType"> 
    <id name="WicketType" 
     type="test.WicketTypeState"/> 
    </class> 
</hibernate-mapping> 

これは上に働きました私の箱(tm)、あなたが何か情報が必要かどうか私に知らせてください。

+0

いいえ - Enumをマップする方法はありますが、マップされたSetでEnumを使用する方法は指定していません。 – Cuga

+0

私のコメントには、例を挙げることができますか?序数を使用して列挙型をマッピングする方法を定義したら、セットマッピングのクラスとしてIntEnumUserTypeを追加するだけでは不十分ですか? –

+0

助けてくれてありがとう。私は何をしようとしているのかをより明確に示しました。私はマッピングのクラスとしてEnumUserTypeを指定しようとします。 – Cuga

3

以下のサンプルコードは、アノテーションでどのようにしたいかを示しています。

@Entity 
@Table (name = "wicket") 
public class Wicket { 

    ... 
    ... 

    private List<WicketType> wicketTypes = new ArrayList<WicketType>(); 

    @CollectionOfElements(fetch=FetchType.EAGER) 
    @JoinTable(
      name="wicket_wicket_types", // ref table. 
      joinColumns = {@JoinColumn(name="wicket_id")} 
    ) 
    @Column(name="wicket_type_id") 
    public List<WicketType> getWicketTypes() { 
     return this.wicketTypes; 
    } 

    public void setWicketTypes(List<WicketType> wicketTypes) { 
     this.wicketTypes = wicketTypes; 
    } 
    ... 
    ... 
} 

WicketTypeその順序および序列挙宣言一致順序とwicket_typeテーブルの列(wicket_type_id)値の標準Java 5の列挙です。

public enum WicketType { 
    WICKET_TYPE1, WICKET_TYPE2 ... 
} 
+0

Hibernate 4で '@ CollectionOfElements'の代わりに' @ ElementCollection'を使用しました –

4

簡単な方法は、

<typedef name="WicketTypeType" class="org.hibernate.type.EnumType"> 
    <param name="enumClass">Wicket</param> 
    <param name="type">12</param> 
</typedef> 

<class name="Wicket"... 

    <set name="WicketType" table="Ref Table"> 
     <key column="W_ID" /> 
     <element column="W_TypeID" type="WicketTypeType"/> 
    </set> 

... 
</class> 
+0

ありがとう、これほど簡単でした –