2009-07-14 14 views
8

हाइबरनेट में, क्या कक्षा के लिए गणित के एक सेट में मैपिंग को परिभाषित करना संभव है?हाइबरनेट में enum प्रकार का एक सेट कैसे मैप करें?

मैं कैसे सेट की मैपिंग को परिभाषित करने के उदाहरण कर लिया है और मैं कैसे Enums मैप करने के लिए के लिए अलग उदाहरण खोजने के लिए कर लिया है, लेकिन मैं समझ नहीं कैसे एक वर्ग के लिए Enums का एक परिभाषित करने के लिए।

क्या कोई मुझे एक उदाहरण प्रदान कर सकता है?

यह मौजूदा एप्लिकेशन के शीर्ष पर बनाया जा रहा है, इसलिए मैं डेटाबेस स्कीमा को बदल नहीं सकता।

यह वह रिश्ता है जिसे मैं मॉडल करना चाहता हूं। विकेट एक सामान्य वर्ग है और विकेट टाइप एक जावा एनम है।

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

धन्यवाद फिर से

+0

आपको एक उदाहरण प्रदान कर सके है? –

उत्तर

2

this करता है कि तुम क्या जरूरत है क्या नहीं?

फ्लिपेंट प्रारंभिक प्रतिक्रिया पर विस्तृत करने के लिए, संदर्भ गणनाओं को मानचित्रित करने के लिए enum के क्रमिक उपयोग का माध्यम प्रदान करता है।

इस मामले में यह वास्तव में सरल दिखता है, क्योंकि आप एक सेट में enums होस्ट कर रहे हैं, आपको विकेट टाइप के लिए उप-प्रकार के IntEnumUserType में एक एक्सेसर प्रदान करना होगा, सुपर-टाइप मैपिंग का ख्याल रखेगा उदाहरण के लिए ordinal। enums के सेट के साथ प्रकार के लिए फिर

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

, उस संपत्ति के लिए एक सेट मानचित्रण परिभाषित:

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 तालिका के लिए मैपिंग परिभाषित

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

इस पर काम किया मेरा बॉक्स (टीएम), अगर आपको और जानकारी चाहिए तो मुझे बताएं।

+0

नहीं - इसका एक एनम मैप करने का कोई तरीका है, लेकिन यह निर्दिष्ट नहीं करता है कि मैप किए गए सेट में उस एनम का उपयोग कैसे करें। – 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 एक मानक जावा 5 Enum जिसका आदेश और enum घोषणाओं मैच आदेश के ऑर्डिनल्स और स्तंभ (wicket_type_id) wicket_type तालिका के मान है।

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

हाइबरनेट 4 –

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

के साथ '@ CollectionOfElements' के बजाय' @ ElementCollection' का उपयोग करें धन्यवाद, इस तरह के रूप में आसान था –

संबंधित मुद्दे