2009-07-14 12 views
8

In ibernazione, è possibile definire una mappatura per una classe su un insieme di enumerazioni?Come mappare un set di tipi enum in Hibernate?

Sono stato in grado di trovare esempi su come definire i mapping di Sets e sono stato in grado di trovare esempi separati su come mappare Enums, ma non riesco a capire come definire un Enum per una classe.

Qualcuno potrebbe fornirci un esempio?

Questo viene creato su un'applicazione esistente, quindi non posso modificare lo schema del database.

Questa è la relazione che desidero modellare. Wicket è una classe normale e WicketType è una Java Enum.

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

Grazie ancora

+0

Potrebbe fornire un esempio? –

risposta

2

Vuol this non fare ciò che è necessario?

Per elaborare l'irriducibile risposta iniziale, il riferimento fornisce un mezzo per utilizzare l'ordinale dell'enumerazione per mappare le enumerazioni.

In questo caso è in realtà più semplice di quanto sembri, poiché si sta ospitando l'enumerazione in un set, è necessario fornire un accessor per WicketType al sottotipo di IntEnumUserType, il super-tipo si occuperà della mappatura l'ordinale per l'istanza.

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

Definire le mappature per la tabella 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> 

Poi per il tipo con il set di enumerazioni, definire una mappatura insieme per quella proprietà:

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

Questo ha lavorato su la mia scatola (tm), fammi sapere se hai bisogno di ulteriori informazioni.

+0

No, questo ha un modo per mappare un Enum, ma non specifica come usare quell'Enum in un Set mappato. – Cuga

+0

Per mio commento, puoi fornire un esempio? Una volta che hai definito come mappare un enum usando l'ordinale, non ti basta aggiungere l'IntEnumUserType come classe nel set mapping? –

+0

Grazie per l'aiuto. Ho fornito un esempio più chiaro di ciò che sto cercando di fare. Proverò a specificare EnumUserType come classe nella mappatura . – Cuga

3

Il seguente codice di esempio mostra come ottenere ciò che si desidera con le annotazioni.

@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 è uno standard Java 5 Enum cui ordine e ordinali delle dichiarazioni enum partita ordine e la colonna (wicket_type_id) valori nella tabella wicket_type.

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

usa '@ ElementCollection' invece di' @ CollectionOfElements' con Hibernate 4 –

4

Un modo più semplice è

<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

Grazie, è stato facile come questo –