2009-07-14 25 views
8

Hazırda beklemede, bir sınıf için bir dizi enum için bir eşleme tanımlamak mümkün mü?Hazırda bekleme modunda bir numara kümesi nasıl eşlenir?

Kümelerin eşlemelerini nasıl tanımlayacağımıza dair örnekler bulabildim ve Enum'ları nasıl eşleyeceğine dair ayrı örnekler bulabildim, ancak bir sınıf için Enemlerin nasıl tanımlanacağını anlayamıyorum.

Lütfen bana bir örnek verebilir misiniz?

Bu, varolan bir uygulamanın üstüne kuruluyor, bu nedenle veritabanı şemasını değiştiremiyorum.

Bu benim modellemek istediğim ilişkidir. Wicket normal bir sınıftır ve WicketType bir Java Enum'dur.

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

tekrar teşekkürler

+0

Eğer bir örnek verebilir misiniz nedir? –

cevap

2

this neye ihtiyacınız yapmaz? Flippant başlangıç ​​cevabını detaylandırmak için referans, numaralandırmayı sıralamak için enumun ordinalini kullanma aracı sağlar.

Bu durumda aslında göründüğünden daha basittir, çünkü enumları bir kümede barındırıyorsunuz, WicketType için bir erişim sağlayıcısını IntEnumUserType alt türüne sağlamış olmanız gerekir, süper tür eşlemeyle ilgilenir örneğe ordinal.

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

enum tablo için eşleştirmeleri tanımlayın:

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

Sonra çeteleler setiyle türü için, bu özellik için bir dizi eşlemesi tanımlayın:

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

Bu çalıştı Benim kutusu (tm), daha fazla bilgiye ihtiyacın olursa haberim olsun.

+0

Hayır - bir Enum'u eşlemenin bir yolu vardır, ancak bu Enum'un eşlenen bir Set'te nasıl kullanılacağını belirtmez. – Cuga

+0

Yorumumda size bir örnek verebilir misiniz? Bir sıralamayı ordinal kullanarak nasıl eşleştireceğinizi tanımladıktan sonra, IntEnumUserType'ı set mapping'te sınıf olarak eklemeniz gerekmez mi? –

+0

Yardımlarınız için teşekkürler. Ne yapmaya çalıştığımı daha açık bir örnek verdim. EnumUserType öğesinin, eşlemesinde sınıf olarak belirtilmesini deneyeceğim. – Cuga

3

Aşağıdaki örnek kod, ek açıklamalarla neye ulaşmak istediğinizi gösterir.

@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 olan sipariş enum bildirimleri eşleme düzeninin sıra sayısı ve sütun (wicket_type_id) wicket_type Tablodaki değerler, standart bir Java 5 enum olan.

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

'@ CollectionOfElements' yerine' @ ElementCollection' yerine Hibernate 4 –

4

basit bir yolu

<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

ile teşekkürler. –

İlgili konular