JPA का उपयोग करके मानचित्र <String, String> संग्रहीत करना


103

मैं सोच रहा हूं कि क्या attributesJPA2 का उपयोग करके निम्न वर्ग में मानचित्र को जारी रखने के लिए एनोटेशन का उपयोग करना संभव है

public class Example {
    long id;
    // ....
    Map<String, String> attributes = new HashMap<String, String>();
    // ....
}

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

create table example_attributes {
    example_id bigint,
    name varchar(100),
    value varchar(100));

जवाबों:


201

JPA 2.0 @ElementCollectionएनोटेशन के माध्यम से आदिम के संग्रह का समर्थन करता है जिसे आप java.util.Mapसंग्रह के समर्थन के साथ संयोजन में उपयोग कर सकते हैं । कुछ इस तरह काम करना चाहिए:

@Entity
public class Example {
    @Id long id;
    // ....
    @ElementCollection
    @MapKeyColumn(name="name")
    @Column(name="value")
    @CollectionTable(name="example_attributes", joinColumns=@JoinColumn(name="example_id"))
    Map<String, String> attributes = new HashMap<String, String>(); // maps from attribute name to value

}

यह भी देखें (JPA 2.0 विनिर्देश में)

  • 2.6 - एंबेडेबल श्रेणी और बुनियादी प्रकार के संग्रह
  • 2.7 मानचित्र संग्रह
  • 10.1.11 - एलिमेंटकॉलिनेशन एनोटेशन
  • 11.1.29 MapKeyColumn एनोटेशन

1
क्या JPA 1 का उपयोग करके ऐसा करने के लिए कोई समाधान है? मुझे केवल उदाहरण मिलते हैंMap<String, SomeOtherClass>
एल। होलांडा

3
यह उल्लेख के लायक है कि example_attributesएक समग्र कुंजी होनी चाहिए (example_id, name)- जो कि hbm2ddl ऊपर से उत्पन्न होगी।
जेम्स बैसेट

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

2
MariaDB का उपयोग करते हुए, मैं Specified key was too long; max key length is 767 bytesयह करने में भाग गया । प्राथमिक कुंजी जिसे बनाने की कोशिश करता है, वह varchar (255) और @JoinColumn का संयोजन है, जो डिफ़ॉल्ट आकार के आकार से अधिक है। आपको अपना डेटाबेस बदलने की ज़रूरत है या लंबाई प्रदान करने के लिए अपने @MapKeyCumn को संशोधित करना है:@MapKeyColumn(name="name", length=100)
जॉन

18
  @ElementCollection(fetch = FetchType.LAZY)
  @CollectionTable(name = "raw_events_custom", joinColumns = @JoinColumn(name =     "raw_event_id"))
  @MapKeyColumn(name = "field_key", length = 50)
  @Column(name = "field_val", length = 100)
  @BatchSize(size = 20)
  private Map<String, String> customValues = new HashMap<String, String>();

यह एक उदाहरण है कि कॉलम और टेबल के नाम और क्षेत्र की लंबाई पर नियंत्रण के साथ एक नक्शा कैसे सेट किया जाए।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.