2009-05-12 18 views

उत्तर

16

क्या आपके लिए निम्नलिखित कार्य नहीं है?

@ManyToMany(cascade = CascadeType.ALL) 
Map<String,EntityType> entitytMap = new HashMap<String, EntityType>(); 

EntityType एक String सहित किसी भी इकाई प्रकार हो सकता है।

import java.io.Serializable; 
import java.util.Map; 

import javax.persistence.Column; 
import javax.persistence.Entity; 
import javax.persistence.GeneratedValue; 
import javax.persistence.GenerationType; 
import javax.persistence.Id; 
import javax.persistence.JoinColumn; 
import javax.persistence.JoinTable;  
import org.hibernate.annotations.CollectionOfElements; 
import org.hibernate.annotations.MapKey; 
@Entity 
public class Book implements Serializable{ 
@Column(name="BOOK_ID") 
@Id 
@GeneratedValue(strategy=GenerationType.AUTO) 
private Long bookId;  

@CollectionOfElements(targetElement=java.lang.String.class) 
@JoinTable(name="BOOK_CHAPTER", 
     [email protected](name="BOOK_ID")) 
@MapKey ([email protected](name="CHAPTER_KEY")) 
@Column(name="CHAPTER") 
private Map<String,String> chapters; 
public Long getBookId() { 
    return bookId; 
} 
public void setBookId(Long bookId) { 
    this.bookId = bookId; 
} 
public Map<String,String> getChapters() { 
    return chapters; 
} 
public void setChapters(Map<String,String> chapters) { 
    this.chapters = chapters; 
}    

} 

यह मेरे लिए काम करता है:

+12

मैं एक छोटे से उलझन में हूँ। प्रश्न मैप <स्ट्रिंग, स्ट्रिंग> मैप करने के बारे में था, लेकिन "सर्वश्रेष्ठ उत्तर" मानचित्र के बारे में है <स्ट्रिंग, EntityType>। क्या मुझे कुछ याद आती है? – whiskeysierra

+9

EntityType स्ट्रिंग समेत किसी इकाई प्रकार का हो सकता है। –

+2

यह कितनी तालिकाओं उत्पन्न करता है? क्या मूल कक्षा के लिए (1) एक है, (2) एक जॉइन टेबल (मूल वर्ग और इकाई प्रकार के लिए कुंजी के साथ) और (3) EntityType के लिए एक और तालिका (दिए गए परिदृश्य में, केवल एक जॉइन के साथ एक तालिका टेबल कुंजी और मैप किए गए स्ट्रिंग)? स्ट्रिंग्स सहेजे गए पर निर्भर करता है यह बहुत अधिक ओवरहेड हो सकता है ... – RobertG

10

मान लीजिए मैं जो अध्याय का एक मानचित्र रहा है बुक नामित एक इकाई है।

+0

+1 मान्य नहीं है। और क्या होगा यदि मैं इन सभी पुस्तकों में से केवल अध्याय 3 को पुनर्प्राप्त करना चाहता हूं? मेरे पास एक समान प्रश्न है: http://stackoverflow.com/questions/12952625/jpa-category-language-relationship – ianaz

+1

@ianaz 'बुक बी से सी का चयन करें b.chapters c में शामिल हों जहां कुंजी (सी) = '3'' –

+3

दुर्भाग्य से, इसके लिए हाइबरनेट-विशिष्ट एनोटेशन की आवश्यकता होती है। सवाल बिना समाधान के लिए था। – RobertG

14

हालांकि सुभेंदु महंता द्वारा दिए गए उत्तर सही हैं। लेकिन @CollectionOfElements बहिष्कृत है। आप @ElementCollection बजाय का उपयोग कर सकते हैं:

@ElementCollection 
@JoinTable(name="ATTRIBUTE_VALUE_RANGE", [email protected](name="ID")) 
@MapKeyColumn (name="RANGE_ID") 
@Column(name="VALUE") 
private Map<String, String> attributeValueRange = new HashMap<String, String>(); 

Map क्षेत्र के लिए एक अलग इकाई वर्ग बनाने के लिए कोई जरूरत नहीं है। यह स्वचालित रूप से किया जाएगा।

1

एक काम कर उदाहरण:

 @ElementCollection(fetch=FetchType.EAGER) 
     @CollectionTable(name = "TABLENAME") 
     @MapKeyColumn(name = "KEY") 
     @Column(name = "VALUE") 
     public Map<String, String> getMap() { 
      return _map; 
     } 
+0

कई से अधिक रिश्ते के लिए, आपको @CollectionTable के भीतर 'joinColumns = @JoinColumn (name = "referencing_column") की आवश्यकता होगी और '@MapKeyJoinColumn (name =" referencing_column_other_table ")' – Blauhirn

+0

मेरा कोड मानचित्र के लिए है <स्ट्रिंग, स्ट्रिंग> इकाई में –

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