2012-10-16 15 views
7

क्या LAZY ऑब्जेक्ट की बजाय आईडी का उपयोग करके ऑब्जेक्ट को LAZY लोड करने और deserialize रखने का कोई तरीका है।हाइबरनेट और जैक्सन में आलसी लोडिंग deserialize

मेरे पास 2 वर्ग हैं जो कई से अधिक रिश्तों से जुड़े हुए हैं।

कुछ इस

public class User { 
    @Id 
    @JsonProperty 
    public long id; 

    @ManyToMany(
      fetch = FetchType.EAGER, 
    ) 
    @JoinTable(
      name = "User_EntityType", 
      joinColumns = @JoinColumn(name = "user_id"), 
      inverseJoinColumns = @JoinColumn(name = "type_id") 
    ) 
    @JsonProperty 
    public Set<Type> types; 

} 

public class Type { 
    @Id 
    @JsonProperty 
    public long id; 

    @ManyToMany(
      fetch = FetchType.EAGER, 
      mappedBy = "types", 
      targetEntity = User.class 
    ) 
    @JsonProperty 
    public Set<User> users; 
} 

डेटा प्रकार की तरह बस ठीक काम करता है। मैं बिना किसी मुद्दे के हाइबरनेट का उपयोग करके लिख और पढ़ सकता हूं।

हालांकि, मैं एक आरईएसटी एपीआई के साथ एक उपयोगकर्ता ऑब्जेक्ट वापस करने में सक्षम होना चाहता हूं, इसलिए मैं जैक्सन का उपयोग इसे deserialize करने के लिए कर रहा हूँ। मुद्दा यह है कि जब मैं ऐसा करता हूं, तो यह उपयोगकर्ता ऑब्जेक्ट में प्रत्येक प्रकार को deserialize, जिसमें अन्य प्रकार की वस्तुओं को शामिल किया गया है, और यह एक बड़ी गड़बड़ी बनाता है।

क्या इसके बजाय प्रकार के सेट के बजाय लंबे प्रकार के प्रकार के सेट को वापस करना संभव है?

उत्तर

4

हां यह संभव है, यदि आप जैक्सन 2.0 का उपयोग ऑब्जेक्ट आइडेंटिटी फीचर के साथ कर रहे हैं।

यदि आप @JsonIdentityInfo एनोटेशन के साथ कक्षा को एनोटेट करते हैं तो जैक्सन केवल ऑब्जेक्ट को आउटपुट करेगा; इसके बाद के संदर्भ आईडी के बजाय आईडी का उपयोग करेंगे। इसलिए आपके प्रकार के सेट आईडी के रूप में क्रमबद्ध किए जाएंगे, जब तक कि प्रकार एक बार आउटपुट हो जाएं। जैक्सन को deserializing जब आईडी वापस वस्तुओं में बदल जाएगा।

आपके मामले में मुझे लगता है कि आप इस तरह अपने प्रकार वर्ग पर टिप्पणी करने की आवश्यकता होगी:

@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id") 
public class Type { 
    ... 
} 

कैसे इस सुविधा का उपयोग करने के बारे में जानकारी के लिए http://wiki.fasterxml.com/JacksonFeatureObjectIdentity देखें।

0

मुझे इस समस्या का सामना करना पड़ रहा था, साथ ही साथ मेरे जेएक्स-आरएस एंडपॉइंट्स में, जिन्हें जैक्सन के ऑब्जेक्ट मैपर का उपयोग करके हाइबरनेट इकाइयों को क्रमबद्ध और सेवा देना है। @JsonIgnore या @JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class,... जैसे समाधानों का उपयोग करने का विकल्प मेरे लिए एक विकल्प नहीं था, क्योंकि पूर्व का मतलब होगा कि संबंध क्षेत्र को धारावाहिक आउटपुट से छोड़ा जाता है, और बाद में विधि का हल इस मुद्दे को हल करने में असफल रहा। ,

ObjectMapper objMapper = new ObjectMapper(); 
objMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false); 

इस तरह, वहाँ, संबंधपरक वस्तुओं को भरने के लिए कोई प्रयास किया गया था बजाय अपने आईडी ऐसे ही छोड़ दिया गया:

तो, मेरे समाधान से पहले वास्तविक क्रमबद्धता कर नक्शाकार पर निम्नलिखित ध्वज सेट करने के लिए था और इसलिए मैं अपने संबंधपरक क्षेत्रों पर fetch = FetchType.LAZY ध्वज रख सकता था।