2010-02-24 10 views
25

एनोटेशन का उपयोग करके आप किसी इकाई में किसी फ़ील्ड को कैसे मैप करते हैं जो किसी ऑब्जेक्ट पर स्ट्रिंग के "मैप" (हैशटेबल) है? ऑब्जेक्ट एनोटेट किया गया है और इसके उदाहरण हाइबरनेट डेटाबेस में पहले ही संग्रहीत हैं। कुंजी के रूप में एक इकाई और इतने की तरह मान के रूप में एक साधारण प्रकार के साथएनोटेशन का उपयोग करके हाइबरनेट में "मानचित्र" को कैसे मैप करते हैं?

<class name="Foo" table="foo"> 
    ... 
    <map role="ages"> 
     <key column="id"/> 
     <index column="name" type="string"/> 
     <element column="age" type="string"/> 
    </map> 
</class> 

और अजीब तरह से:

मैं एक साधारण कुंजी और जैसे मूल्य के साथ एक नक्शा definging के लिए वाक्यविन्यास पाया है

<class name="Foo" table="foo"> 
    ... 
    <map role="ages"> 
    <key column="id"/> 
    <index-many-to-many column="person_id" 
     class="Person"/> 
    <element column="age" type="string"/> 
    </map> 
</class> 
<class name="Person" table="person"> 
    ... 
    <property name="name" column="name" 
     type="string"/> 
</class> 

लेकिन मुझे यह नहीं पता कि तत्व मैपिंग के लिए एक सरल कुंजी के लिए यह कैसे करना है, और मुझे नहीं लगता कि एनोटेशन का उपयोग करके इसे कैसे किया जाए।

+1

में एक उपयोगकर्ता के लिए अद्वितीय है यह सही ढंग से यहाँ से समझाया गया है :

अन्य posibility ऐसा ही कुछ है http://stackoverflow.com/questions/3393649/storing-a-mapstring-string-using-jpa – jalogar

उत्तर

33

आप बस, जेपीए एनोटेशन@MapKey (ध्यान दें कि जेपीए एनोटेशन हाइबरनेट से अलग है, हाइबरनेट @MapKey नक्शे एक डेटाबेस स्तंभ नक्शा कुंजी दबाए रख इस्तेमाल कर सकते हैं, जबकि जेपीए के एनोटेशन के लिए संपत्ति के नक्शे मानचित्र की कुंजी के रूप में इस्तेमाल किया जाना चाहिए)।

@javax.persistence.OneToMany(cascade = CascadeType.ALL) 
@javax.persistence.MapKey(name = "name") 
private Map<String, Person> nameToPerson = new HashMap<String, Person>(); 
+0

धन्यवाद मैं इसे आजमाउंगा। यह किस तरह का डाटाबेस स्कीमा दर्शाता है? मैं डीबी इकाई का उपयोग कर रहा हूं और एक्सएमएल का उपयोग कर डेटासेट को पॉप्युलेट करने में सक्षम होना चाहता हूं। क्या यह एक जॉइन टेबल का उपयोग करता है? यदि ऐसा है तो आप निर्दिष्ट कर सकते हैं कि तालिका क्या कहलाती है और जॉइन टेबल के कॉलम क्या हैं? –

+2

@Omar यह एक जॉइन टेबल बनाता है (डिफ़ॉल्ट रूप से FOO_PERSON)। आप '@ javax.persistence.JoinTable' का उपयोग कर नाम को नियंत्रित कर सकते हैं। कॉलम के बारे में निश्चित नहीं है। –

1

आपको शायद उपयोगकर्ता टाइप या उपयोगकर्ता कोलेक्शन टाइप का उपयोग करना चाहिए। या, आप एक कस्टम tupleizer का उपयोग कर सकते हैं।

अवधारणाओं के लिए hibernate core documentation और समकक्ष एनोटेशन दृष्टिकोण के लिए hibernate annotations documentation देखें।

मुझे बताएं कि क्या वह नहीं है जो आप पूछ रहे हैं।

+0

मुझे बेवकूफ की तरह लगने से नफरत है, लेकिन मैं उन सभी दो पृष्ठों को पूरे दिन चालू और बंद कर रहा हूं और मैं इसे पाने के लिए प्रतीत नहीं होता है। मैं इस शैली को देख रहा हूं: <मानचित्र भूमिका = "आयु"> <कुंजी कॉलम = "आईडी" /> <अनुक्रमणिका कॉलम = "नाम" प्रकार = "स्ट्रिंग" /> <तत्व कॉलम = " आयु "टाइप =" स्ट्रिंग "/> जो मुझे लगता है कि मुझे किस तरह की चीज चाहिए, मुझे समझ में नहीं आता कि यह एनोटेशन के रूप में कैसे किया जाए। मैं यह भी नहीं जानता कि तत्व यह कैसे करेगा यदि तत्व स्ट्रिंग नहीं था। क्या मेरे पास छड़ी का गलत अंत है। –

+0

हां, मुझे लगता है कि आप वास्तव में उपयोगकर्ता टाइप चाहते हैं, क्योंकि यहां चर्चा की गई सभी अन्य चीजें (मुझे विश्वास है) मानचित्र को स्टोर करने के लिए एक और टेबल बनाएं। उपयोगकर्ता टाइप इंटरफ़ेस को देखें और आप देखेंगे कि केवल कुछ विधियां हैं लागू करने के लिए। असल में आप हाइबरनेट बताते हैं, एक परिणामसेट दिया गया है, इसे जावा प्रकार में कैसे रखा जाए और इसके विपरीत। –

8
@CollectionOfElements(fetch = FetchType.LAZY) 
@JoinTable(name = "JOINTABLE_NAME", 
    joinColumns = @JoinColumn(name = "id")) 
@MapKey(columns = @Column(name = "name")) 
@Column(name = "age") 
private Map<String, String> ages = new HashMap<String, String>(); 
+0

यह वह चीज है जिसे मैं ढूंढ रहा हूं, हालांकि अगर मैं कुंजी में एक स्ट्रिंग था और मूल्य एक और वस्तु थी तो मैं यह कैसे करूँगा? –

+0

यह एक एनम मैपिंग के लिए एनोटेशन के समान दिखता है। –

+0

@ ओमार: अपनी पसंद के इकाई प्रकार के साथ "स्ट्रिंग" को बदलने के रूप में सरल होना चाहिए। आपको @ कॉलम (नाम = "आयु") को हटाने की आवश्यकता हो सकती है और @ JoinTable-annotation में inverseJoinColumns = @ JoinColumn (name = "fk_ik") जैसे कुछ जोड़ना पड़ सकता है। हालांकि यकीन नहीं है। – whiskeysierra

2

मुझे पता है कि यह प्रश्न बहुत पुराना है लेकिन शायद यह किसी की मदद कर सकता है। ,

@Entity 
@Table(name = "PREFERENCE", uniqueConstraints = { @UniqueConstraint(columnNames = { "ID_DOMAIN", "ID_USER", "KEY" })}) 
public class Preferences { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "ID", unique = true, nullable = false) 
    private Long id; 

    @Column(name = "ID_DOMAIN", unique = false, nullable = false") 
    private Long domainId; 

    @Column (name = "PREFERENCE_KEY") 
    @Enumerated(EnumType.STRING) 
    private PreferenceKey key; 

    @ManyToOne(fetch = FetchType.LAZY) 
    @JoinColumn(name = "ID_USER", referencedColumnName = "ID") 
    private User user; 
} 

and 

@Entity 
@Table(name = "USER", uniqueConstraints = { @UniqueConstraint(columnNames = { "ID_DOMAIN", "LOGIN" })}) 
public class User { 
    @Id 
    @GeneratedValue(strategy = GenerationType.AUTO) 
    @Column(name = "ID", unique = true, nullable = false) 
    private Long id; 

    @Column(name = "ID_DOMAIN", unique = false, nullable = false") 
    private Long domainId; 

    // more fields 

    @ElementCollection(fetch = FetchType.LAZY) 
    @JoinColumns({@JoinColumn(name = "ID_USER", referencedColumnName = "ID"), @JoinColumn(name = "ID_DOMAIN", referencedColumnName = "ID_DOMAIN")}) 
    @OneToMany(targetEntity = Preferences.class, fetch = FetchType.LAZY) 
    @MapKey(name = "key") 
    private Map<PreferenceKey, Preferences> preferencesMap; 
} 

यह केवल का उत्पादन दो तालिकाओं उपयोगकर्ता और प्राथमिकताएं ध्यान दें कि PreferenceKey एक डोमेन