2009-07-14 14 views
8

W stanie hibernacji możliwe jest zdefiniowanie mapowania dla klasy w zestawie wyliczeń?Jak zmapować zestaw typu wyliczeniowego w trybie hibernacji?

Udało mi się znaleźć przykłady definiowania odwzorowań zestawów i udało mi się znaleźć osobne przykłady, jak zamapować wyliczenia, ale nie mogę wymyślić, jak zdefiniować wyliczenia dla klasy.

Czy ktoś mógłby podać mi przykład?

Jest on tworzony na podstawie istniejącej aplikacji, więc nie mogę zmienić schematu bazy danych.

To jest relacja, którą chcę modelować. Wicket to normalna klasa, a WicketType to Java Enum.

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

Dzięki ponownie

+0

mógłby Pan podać przykład? –

Odpowiedz

2

Czy this nie robić to, co trzeba?

Aby opracować początkową odpowiedź zwrotną, odwołanie udostępnia sposób na użycie wyliczenia wyliczeniowego dla liczby wyliczeniowej.

W tym przypadku jest to w rzeczywistości prostsze, niż się wydaje, ponieważ hostuje enumy w zestawie, należy zapewnić akcesorium typu WicketType podtypu typu IntEnumUserType, supertyp zajmie się mapowaniem porządek do instancji.

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

Definiowanie mapowania dla tabeli ENUM:

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

Wtedy dla danego typu z zestawu teksty stałe, zdefiniować zestaw odwzorowanie dla tej nieruchomości:

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

To działało na moje pudełko (tm), daj mi znać, jeśli potrzebujesz więcej informacji.

+0

Nie - to ma sposób na mapowanie Enum, ale nie określa sposobu użycia tego Enum w zmapowanym zestawie. – Cuga

+0

Za mój komentarz, możesz podać przykład? Po zdefiniowaniu sposobu mapowania wyliczenia przy użyciu liczby porządkowej, czy nie należy dodawać klasy IntEnumUserType jako klasy w zestawie mapowania? –

+0

Dzięki za pomoc. Podałem jaśniejszy przykład tego, co próbuję zrobić. Spróbuję określić EnumUserType jako klasę w mapowaniu . – Cuga

3

Poniższy przykładowy kod pokazuje, jak można osiągnąć dzięki adnotacjom.

@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 jest standardem Java 5 Enum której położenie i porządkowe ZGŁOSZEŃ wyliczeniowe celu dopasowania i kolumna (wicket_type_id) Wartości w tabeli wicket_type.

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

użyć '@ ElementCollection' zamiast' @ CollectionOfElements' z Hibernate 4 –

4

Prostszym sposobem jest

<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

Dzięki, było tak proste, jak to –

Powiązane problemy