वर्ग के लिए कोई भी धारावाहिक नहीं मिला। org.hibernate.proxy.pojo.javassist.Javassist?


94

मैं काम कर रहा हूं SpringMVC, Hibernateऔर JSONमुझे यह त्रुटि मिल रही है।

HTTP Status 500 - Could not write JSON: No serializer found for class org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationConfig.SerializationFeature.FAIL_ON_EMPTY_BEANS) ) 

कृपया नीचे मेरी इकाई की जाँच करें

    @Entity
@Table(name="USERS")
public class User {

    @Id
    @GeneratedValue
    @Column(name="USER_ID")
    private Integer userId;

    @Column(name="USER_FIRST_NAME")
    private String firstName;

    @Column(name="USER_LAST_NAME")
    private String lastName;


    @Column(name="USER_MIDDLE_NAME")
    private String middleName;

    @Column(name="USER_EMAIL_ID")
    private String emailId;

    @Column(name="USER_PHONE_NO")
    private Integer phoneNo;

    @Column(name="USER_PASSWORD")
    private String password;

    @Column(name="USER_CONF_PASSWORD")
    private String  confPassword;

    @Transient
    private String token;

    @Column(name="USER_CREATED_ON")
    private Date createdOn;

    @OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL)
    @Fetch(value = FetchMode.SUBSELECT)
    @JoinTable(name = "USER_ROLES", joinColumns = { @JoinColumn(name = "USER_ID") }, inverseJoinColumns = { @JoinColumn(name = "ROLE_ID") })
    private List<ActifioRoles> userRole = new ArrayList<ActifioRoles>();


    @OneToMany(fetch=FetchType.EAGER,cascade=CascadeType.ALL,mappedBy="userDetails")
    @Fetch(value = FetchMode.SUBSELECT)
    private List<com.actifio.domain.Address> userAddress = new ArrayList<com.actifio.domain.Address>();

    @OneToOne(cascade=CascadeType.ALL)
    private Tenant tenantDetails;


    public Integer getUserId() {
        return userId;
    }
    public void setUserId(Integer userId) {
        this.userId = userId;
    }
    public String getFirstName() {
        return firstName;
    }
    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }
    public String getLastName() {
        return lastName;
    }
    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
    public String getEmailId() {
        return emailId;
    }
    public void setEmailId(String emailId) {
        this.emailId = emailId;
    }
    public String getPassword() {
        return password;
    }
    public void setPassword(String password) {
        this.password = password;
    }
    public String getConfPassword() {
        return confPassword;
    }
    public void setConfPassword(String confPassword) {
        this.confPassword = confPassword;
    }
    public Date getCreatedOn() {
        return createdOn;
    }
    public void setCreatedOn(Date createdOn) {
        this.createdOn = createdOn;
    }

    public List<ActifioRoles> getUserRole() {
        return userRole;
    }

    public void setUserRole(List<ActifioRoles> userRole) {
        this.userRole = userRole;
    }
    public String getMiddleName() {
        return middleName;
    }
    public void setMiddleName(String middleName) {
        this.middleName = middleName;
    }
    public Integer getPhoneNo() {
        return phoneNo;
    }
    public void setPhoneNo(Integer phoneNo) {
        this.phoneNo = phoneNo;
    }

    public List<com.actifio.domain.Address> getUserAddress() {
        return userAddress;
    }
    public void setUserAddress(List<com.actifio.domain.Address> userAddress) {
        this.userAddress = userAddress;
    }
    public Tenant getTenantDetails() {
        return tenantDetails;
    }
    public void setTenantDetails(Tenant tenantDetails) {
        this.tenantDetails = tenantDetails;
    }
    public String getToken() {
        return token;
    }
    public void setToken(String token) {
        this.token = token;
    }

    }

इसे कैसे हल किया जा सकता है?


कृपया स्टैकट्रेस और कोड दिखाएं जहां अपवाद होता है
जूलैंड

अपने कोड करने के लिए कोशिश कर रहा है क्या की किसी भी जानकारी होने के बिना, यह डिबग करने के लिए थोड़ा मुश्किल है, लेकिन आप शायद बाहर की जाँच करना चाहते हैं github.com/FasterXML/jackson-datatype-hibernate जब से तुम जैक्सन और हाइबरनेट उपयोग कर रहे हैं
geoand

क्या आप इस वर्ग से JSON बनाने का प्रयास कर रहे हैं? इस मामले में, जेएसएन सीराइज़र सभी संपत्तियों को लिखने की कोशिश करता है, आपके कई-कई रिश्तों के हैशसेट भी; यह एक आलसी शुरुआती अपवाद बनाता है
एंजेलो

एक ही सवाल stackoverflow.com/questions/4362104/… पर पाया जा सकता है
मैट्रिक्स बस्टर

@ user2963481 ... अच्छा और बहुत मदद करने वाला प्रश्न भाई।
ब्रेन

जवाबों:


192

मुझे हाइबरनेट प्रॉक्सी ऑब्जेक्ट के माध्यम से आलसी लोडिंग के साथ एक समान समस्या थी। इसके साथ उस वर्ग को एनोटेट करके समझें जिसमें आलसी भरी निजी संपत्तियाँ हों:

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})

मुझे लगता है कि आप अपने प्रॉक्सी ऑब्जेक्ट पर गुण जोड़ सकते हैं जो उस एनोटेशन के JSON क्रमांकन को तोड़ता है।

समस्या यह है कि संस्थाओं को पूरी तरह से लोड होने से पहले ही आलसी और क्रमबद्ध रूप से लोड किया जाता है।

Hibernate.initialize(<your getter method>);

3
इसने मेरे लिए भी काम किया ... क्या इस अजीब व्यवहार का कोई स्पष्टीकरण है?
विक्टर

7
@ akur-singhal आपको इस बात पर जोर देना चाहिए कि इस एनोटेशन की आवश्यकता नेस्टेड क्लास पर है न कि कॉलिंग क्लास पर।
डारवेने

1
याहू ... यह काम किया। मैंने कई बार कोशिश की और काम किया। मैंने कुछ तरीके और BoooM की कोशिश की। काम किया।
ब्रेन

2
धन्यवाद मेरे लिए भी काम किया। आपको इस एनोटेशन को उन संस्थाओं से जोड़ना होगा जो आलसी भरी हुई फलियों के साथ अन्य संस्थाओं तक पहुंच बनाती हैं।
शफाकत शफी

3
मुझे लगता है कि यह मुद्दे का सही समाधान नहीं है। जब हम अनुक्रमित करते हैं, तो हम उम्मीद करते हैं कि या तो पूरा सब -जेक्ट, या परिणाम में कम से कम उप-ऑब्जेक्ट की प्राथमिक कुंजी वापस लौटाया जाए। इन एनोटेशन को जोड़ने से केवल त्रुटि को दबाया जा सकता है, लेकिन आपको वांछित परिणाम प्रदान नहीं करेगा।
आनंद वैद्य

84

बस इसे जोड़ने के लिए, मैं इसी मुद्दे में भाग गया, लेकिन आपूर्ति किए गए उत्तर काम नहीं कर रहे थे। मैंने इसे अपवाद का सुझाव देकर और application.properties फ़ाइल में जोड़कर ठीक किया ...

spring.jackson.serialization.fail-on-empty-beans=false

मैं हाइबरनेट 4.3 के साथ स्प्रिंग बूट v1.3 का उपयोग कर रहा हूं

यह अब संपूर्ण ऑब्जेक्ट और नेस्टेड ऑब्जेक्ट को क्रमबद्ध करता है।

EDIT: 2018

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


8
समस्या को हल करता है लेकिन json में दो अतिरिक्त अनावश्यक गुण होंगे"handler":{},"hibernateLazyInitializer":{}
सुंदरविरोध

महान! यहाँ भी तय है, यह उत्तर है
हिनोटी

@prettyvoid क्यों अतिरिक्त गुण मौजूद हैं?
रॉबर्ट मून

12
@RobertMoon यदि आप उनसे छुटकारा पाना चाहते हैं, तो आप अपनी संस्था को एनोटेट कर सकते हैं@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
prettyvoid

@prettyvoid धन्यवाद। मैंने पाया कि एक और उपाय है LAZY को EAGER में बदलना। क्या यह किसी प्रदर्शन पर असर डालता है?
रॉबर्ट मून

68

जैसा कि पिछले उत्तरों में सही ढंग से सुझाया गया है, आलसी लोडिंग का मतलब है कि जब आप डेटाबेस से अपनी वस्तु प्राप्त करते हैं, तो नेस्टेड ऑब्जेक्ट नहीं लाए जाते हैं (और बाद में आवश्यकता पड़ने पर प्राप्त किया जा सकता है)।

अब जैक्सन नेस्टेड ऑब्जेक्ट (== JSON को इससे बाहर) बनाने की कोशिश करता है, लेकिन यह सामान्य ऑब्जेक्ट के बजाय JavassistLazyInitializer ढूंढने में विफल रहता है। यह आपको दिखाई देने वाली त्रुटि है। अब, इसे कैसे हल किया जाए?

जैसा कि पहले CP510 ने सुझाव दिया था, एक विकल्प कॉन्फ़िगरेशन की इस लाइन द्वारा त्रुटि को दबाने का है:

spring.jackson.serialization.fail-on-empty-beans=false

लेकिन यह लक्षणों से निपट रहा है, कारण नहीं । इसे सुरुचिपूर्ण ढंग से हल करने के लिए, आपको यह तय करने की आवश्यकता है कि आपको JSON में इस ऑब्जेक्ट की आवश्यकता है या नहीं?

  1. क्या आपको JSON में ऑब्जेक्ट की आवश्यकता है, को निकालें FetchType.LAZY उस फ़ील्ड से विकल्प को इसका कारण बनता है (यह कुछ नेस्टेड ऑब्जेक्ट में फ़ील्ड भी हो सकता है, न केवल उस रूट इकाई में जो आप ला रहे हैं)।

  2. @JsonIgnoreउदाहरण के लिए , यदि JSON में ऑब्जेक्ट की आवश्यकता नहीं है, तो इस फ़ील्ड (या फ़ील्ड को स्वयं, यदि आपको आवक मानों को स्वीकार करने की आवश्यकता नहीं है) के साथ एनोटेट करें :

    // this field will not be serialized to/from JSON @JsonIgnore private NestedType secret;

क्या आपको अधिक जटिल आवश्यकताएं (जैसे एक ही इकाई का उपयोग करने वाले विभिन्न REST नियंत्रकों के लिए अलग-अलग नियम) का उपयोग करना चाहिए, आप जैक्सन विचार या फ़िल्टरिंग का उपयोग कर सकते हैं या बहुत ही सरल उपयोग के मामले के लिए, अलग से नेस्टेड ऑब्जेक्ट ला सकते हैं।


15
यह सबसे अच्छा जवाब है। समस्या की जड़ को संबोधित करें, अगले प्रोग्रामर से निपटने के लिए लक्षणों को नकाब न करें।
एंड्रयू

2
आप मेरे हीरो हैं।
लेन्सग्रास

त्रुटि के पीछे का कारण
बताने

इसके लिए धन्यवाद, हालांकि मैं देख रहा हूं कि RangeError: Maximum call stack size exceeded
स्प्रिंगफॉक्स

18

आप जैक्सन के लिए एड-ऑन मॉड्यूल का उपयोग कर सकते हैं जो हाइबरनेट आलसी-लोडिंग को संभालता है।

पर अधिक जानकारी https://github.com/FasterXML/jackson-datatype-hibernate जो समर्थन 3 और 4 हाइबरनेट अलग से।


7
यह वास्तव में सही उत्तर होना चाहिए। अन्य सभी उत्तर इस मुद्दे को हल करने के बजाय समस्या को छिपा रहे हैं।
अहमद हसनैन

लेकिन इस मॉड्यूल का उपयोग कैसे करें? क्या इसके लिए कोई गाइड है?
आनंद वैद्य

जैकसन-डेटाटाइप-हाइबरनेट कॉन्फ़िगर करने के तरीके: stackoverflow.com/q/33727017
चेस

13

मुझे लगता है कि समस्या वह तरीका है जिससे आप इकाई को पुनः प्राप्त करते हैं।

शायद आप ऐसा कुछ कर रहे हैं:

Person p = (Person) session.load(Person.class, new Integer(id));

getइसके बजाय विधि का उपयोग करने का प्रयास करेंload

Person p = (Person) session.get(Person.class, new Integer(id));

समस्या यह है कि लोड विधि से आपको सिर्फ एक प्रॉक्सी मिलती है, लेकिन वास्तविक वस्तु नहीं। प्रॉक्सी ऑब्जेक्ट में पहले से लोड किए गए गुण नहीं होते हैं इसलिए जब क्रमांकन होता है तो क्रमबद्ध होने के लिए कोई गुण नहीं होते हैं। प्राप्त विधि से आपको वास्तव में वास्तविक वस्तु मिलती है, यह वस्तु वास्तव में क्रमबद्ध हो सकती है।


2
एक समान त्रुटि मेरे साथ हुई जब मैंने getOne के बजाय getOne का उपयोग किया। मेरे मामले में, मेरा इंटरफ़ेस रिपॉजिटरी JpaRepository था। findOne किसी भी Json एनोटेशन के बिना अच्छी तरह से काम किया है या application.properties में आने वाले बदलाव
जेम्स Freitas

जेम्स फ्रीटास की तरह, मैंने यह भी पाया कि गेटऑन ने इस मुद्दे को जन्म दिया और इसके बजाय, उदाहरण के लिए, findById का उपयोग करके समस्या का समाधान किए बिना एनोटेशन या ऊपर दी गई लाइन का उपयोग करने के लिए आवेदन गुणों में उपयोग किया
MY

1
मेरे काम के साथी ने मुझे स्पष्ट किया और बताया कि: "मूल अंतर यह है कि getOne आलसी है और findOne नहीं है" - मतलब स्पष्ट है कि पूर्व में वास्तव में db से डेटा पंक्तियाँ नहीं मिलती हैं, लेकिन सिर्फ संदर्भ बनाता है। उत्तरार्द्ध के बजाय, वास्तव में पंक्तियाँ प्राप्त होती हैं, जो कि अक्सर वांछित होने वाली स्थिति है
MY

@JamesFreitas हाँ! धन्यवाद! और इस अच्छे निष्कर्ष के लिए जेम्स का नेतृत्व करने के लिए कार्लोस को धन्यवाद!
फिलीप सैविक

9

इससे मेरा काम बनता है

@JsonIgnoreProperties({"hibernateLazyInitializer","handler"})

जैसे

@Entity
@Table(name = "user")
@Data
@NoArgsConstructor
@JsonIgnoreProperties({"hibernateLazyInitializer","handler"})
public class User {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String name;

    private Date created;

}

5

समस्या को ठीक करने के दो तरीके हैं।

रास्ता 1 :

जोड़े spring.jackson.serialization.fail-on-empty-beans=falseमें application.properties

रास्ता २ :

join fetchमूल वस्तु डेटा प्राप्त करने के लिए JPQL क्वेरी में उपयोग करें , नीचे देखें:

@Query(value = "select child from Child child join fetch child.parent Parent ",
           countQuery = "select count(*) from Child child join child.parent parent ")
public Page<Parent> findAll(Pageable pageable); 

धन्यवाद! पहला उपाय यह बहुत अच्छा है!
लुकास मोयानो एंजेलिनी

रास्ता 1. महान। धन्यवाद।
लीनग्रोस

3

इस एनोटेशन को इकाई वर्ग (मॉडल) में जोड़ें जो मेरे लिए काम करता है क्योंकि यह हाइबरनेट प्रॉक्सी ऑब्जेक्ट के माध्यम से आलसी लोड हो रहा है।

@JsonIgnoreProperties ({"hibernateLazyInitializer", "हैंडलर"})


2

यह अपवाद

org.springframework.http.converter.HttpMessageNotWritableException

क्योंकि, मुझे आशा है कि, आपकी प्रतिक्रिया प्रतिक्रिया उत्पादन को सीरियल योग्य वस्तु के रूप में भेज रही है।
यह वसंत में होने वाली समस्या है। इस मुद्दे पर आने के लिए, POJO ऑब्जेक्ट को प्रतिक्रिया आउटपुट के रूप में भेजें।

उदाहरण :

    @Entity
    @Table(name="user_details")
    public class User implements Serializable{

        @Id
        @GeneratedValue(strategy= GenerationType.IDENTITY)
        @Column(name="id")
        private Integer id;

        @Column(name="user_name")
        private String userName;

        @Column(name="email_id")
        private String emailId;

        @Column(name="phone_no")
        private String phone;

//setter and getters

POJO वर्ग:

public class UserVO {

    private int Id;
    private String userName;
    private String emailId;
    private String phone;
    private Integer active;

//setter and getters

नियंत्रक में सीरजेबल ऑब्जेक्ट फ़ील्ड को POJO वर्ग फ़ील्ड में कनवर्ट करें और पॉज़ो क्लास को आउटपुट के रूप में लौटाएं।

         User u= userService.getdetials(); // get data from database

        UserVO userVo= new UserVO();  // created pojo class object

        userVo.setId(u.getId());
        userVo.setEmailId(u.getEmailId());
        userVo.setActive(u.getActive());
        userVo.setPhone(u.getPhone());
        userVo.setUserName(u.getUserName());
       retunr userVo;  //finally send pojo object as output.

हां मैं भी यही कर रहा हूं, लेकिन मैं भी वही कर रहा हूं, वही त्रुटि हो रही है, क्योंकि मैं ऑब्जेक्ट्स को संबंधित डेटा भेज रहा हूं जो कि एंटिटी क्लासेस सेट करने के अलावा कुछ भी नहीं है
Pra_A

2

हाइबरनेट 5.2 और इसके बाद के संस्करण में, आप नीचे दिए अनुसार हाइबरनेट प्रॉक्सी को निकालने में सक्षम हैं, यह आपको वास्तविक वस्तु देगा ताकि आप इसे ठीक से अनुक्रमित कर सकें:

Object unproxiedEntity = Hibernate.unproxy( proxy );

यह स्वचालित Hibernate.initializeरूप से पहले से ही कॉल करेगा ।
GMsoF

@ तैमूर, इसे जसन सीरियल से पहले जोड़ा जाना चाहिए। समस्या इसलिए होती है क्योंकि सीरियलाइज़ेशन के दौरान हाइबरनेट प्रॉक्सी ऑब्जेक्ट पाया जाता है, इसलिए एक बार इसे हटा देने के बाद, सीरीज़ेशन ठीक हो जाएगा। यदि आप वसंत नियंत्रक का उपयोग कर रहे हैं, तो आपको इसे नियंत्रक समाप्त होने से पहले करना होगा।
GMsoF

1

हाइबरनेट के लिए आप जैसन क्रमांकन / आलसी-भार वाली वस्तुओं के साथ डीरिएलाइजेशन को समायोजित करने के लिए जैकसन-डेटाटाइप-हाइबरनेट प्रोजेक्ट का उपयोग कर सकते हैं ।

उदाहरण के लिए,

import com.fasterxml.jackson.databind.Module;
import com.fasterxml.jackson.datatype.hibernate5.Hibernate5Module;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class JacksonDatatypeHibernate5Configuration {

    // Register Jackson Hibernate5 Module to handle JSON serialization of lazy-loaded entities
    // Any beans of type com.fasterxml.jackson.databind.Module are automatically
    // registered with the auto-configured Jackson2ObjectMapperBuilder
    // https://docs.spring.io/spring-boot/docs/current/reference/html/howto-spring-mvc.html#howto-customize-the-jackson-objectmapper
    @Bean
    public Module hibernate5Module() {
        Hibernate5Module hibernate5Module = new Hibernate5Module();
        hibernate5Module.enable( Hibernate5Module.Feature.FORCE_LAZY_LOADING );
        hibernate5Module.disable( Hibernate5Module.Feature.USE_TRANSIENT_ANNOTATION );
        return hibernate5Module;
    }
}

अगर मैंने इसका इस्तेमाल किया तो मुझे मिलता है can't parse JSON. Raw result:। कोई मदद?
प्रातः

1

समाधान @ समाधान द्वारा नीचे दिए गए समाधान से प्रेरित है। मैंने इन डाटेल्स के साथ उनके उत्तर को भी अपडेट किया है।

यहां समस्या उप-वस्तुओं के आलसी लोडिंग के बारे में है, जहां जैक्सन केवल पूर्ण विकसित वस्तुओं के बजाय हाइबरनेट प्रॉक्सी ढूंढता है।

इसलिए हमें दो विकल्पों के साथ छोड़ दिया जाता है - अपवाद को दबाएं, जैसे कि ऊपर दिए गए सबसे अधिक वोट किए गए उत्तर में यहां दिया गया है, या सुनिश्चित करें कि LazyLoad ऑब्जेक्ट लोड किए गए हैं।

यदि आप बाद वाले विकल्प के साथ जाना चुनते हैं, तो समाधान जैक्सन-डेटाटाइप लाइब्रेरी का उपयोग करना होगा , और क्रमांकन से पहले आलसी-लोड निर्भरता को शुरू करने के लिए लाइब्रेरी को कॉन्फ़िगर करना होगा।

मैंने ऐसा करने के लिए एक नया विन्यास वर्ग जोड़ा।

@Configuration
public class JacksonConfig extends WebMvcConfigurerAdapter {

@Bean
@Primary
public MappingJackson2HttpMessageConverter jacksonMessageConverter(){
    MappingJackson2HttpMessageConverter messageConverter = new MappingJackson2HttpMessageConverter();
    ObjectMapper mapper = new ObjectMapper();
    Hibernate5Module module = new Hibernate5Module();
    module.enable(Hibernate5Module.Feature.FORCE_LAZY_LOADING);
    mapper.registerModule(module);
    messageConverter.setObjectMapper(mapper);
    return messageConverter;
}

}

@Primaryयह सुनिश्चित करता है कि किसी भी अन्य बीन्स को इनिशियलाइज़ करने के लिए किसी अन्य जैक्सन कॉन्फिग का उपयोग नहीं किया जाता है। @Beanहमेशा की तरह है।module.enable(Hibernate5Module.Feature.FORCE_LAZY_LOADING);निर्भरता के आलसी लोडिंग को सक्षम करने के लिए है।

सावधानी - कृपया इसके प्रदर्शन प्रभाव को देखें। कभी-कभी EAGER लाने में मदद करता है, लेकिन अगर आप इसे उत्सुक बनाते हैं, तब भी आपको इस कोड की आवश्यकता है, क्योंकि प्रॉक्सी ऑब्जेक्ट अभी भी अन्य सभी मैपिंग के लिए मौजूद हैं@OneToOne

पुनश्च: एक सामान्य टिप्पणी के रूप में, मैं पूरे डेटा ऑब्जेक्ट को Json प्रतिक्रिया में वापस भेजने के अभ्यास को हतोत्साहित करूंगा, एक को इस संचार के लिए Dto का उपयोग करना चाहिए, और मैप करने के लिए कुछ अवरोधक जैसे मैपर का उपयोग करना चाहिए। यह आपको आकस्मिक सुरक्षा खामियों से बचाता है, साथ ही साथ उपरोक्त अपवाद भी।


1

मैं अभी एक ही समस्या है। जाँच करें कि क्या आप @jsonIQgnore के साथ आलसी में भ्रूण को ठीक करते हैं

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name="teachers")
@JsonIgnoreProperties("course")
Teacher teach;

बस "(fetch = ...)" या एनोटेशन "@jsonIgnore" को हटा दें और यह काम करेगा

@ManyToOne
@JoinColumn(name="teachers")
@JsonIgnoreProperties("course")
Teacher teach;

0

या आप के रूप में मैपर कॉन्फ़िगर कर सकते हैं:

// आलसी लोडिंग के लिए कस्टम कॉन्फ़िगरेशन

public static class HibernateLazyInitializerSerializer extends JsonSerializer<JavassistLazyInitializer> {

    @Override
    public void serialize(JavassistLazyInitializer initializer, JsonGenerator jsonGenerator,
            SerializerProvider serializerProvider)
            throws IOException, JsonProcessingException {
        jsonGenerator.writeNull();
    }
}

और मैपर कॉन्फ़िगर करें:

    mapper = new JacksonMapper();
    SimpleModule simpleModule = new SimpleModule(
            "SimpleModule", new Version(1,0,0,null)
    );
    simpleModule.addSerializer(
            JavassistLazyInitializer.class,
            new HibernateLazyInitializerSerializer()
    );
    mapper.registerModule(simpleModule);

0

यह आपके हाइबरनेट इकाई संबंध का कारण हो सकता है ... बस उस संबंधित निकाय के आलसी लोडिंग को रोकें ... उदाहरण के लिए ... मैंने नीचे कस्टमर टाइप के लिए आलसी = "गलत" सेट करके हल किया।

<class name="Customer" table="CUSTOMER">
        <id name="custId" type="long">
            <column name="CUSTID" />
            <generator class="assigned" />
        </id>
        <property name="name" type="java.lang.String">
            <column name="NAME" />
        </property>
        <property name="phone" type="java.lang.String">
            <column name="PHONE" />
        </property>
        <property name="pan" type="java.lang.String">
            <column name="PAN" />
        </property>

        <many-to-one name="customerType" not-null="true" lazy="false"></many-to-one>
    </class>
</hibernate-mapping>

1
कृपया अपने पोस्ट में सूचित करें कि यह वास्तविक जीवन के आवेदन में बहुत ही खतरनाक समाधान हो सकता है।
पनगर्ग

0

मैं बदल गया (एनोटेशन मॉडल वर्ग में)

भ्रूण = FetchType.LAZY

सेवा

भ्रूण = भ्रूण

और सुंदर तरीके से काम किया ...

इसे प्यार करना।


5
जबकि यह समस्या को हल करता है यह बहुत खतरनाक है। fetchएक मॉडल पर रणनीति बदलने से प्रदर्शन में कई परिणाम होते हैं। इस परिवर्तन के साथ, आप डेटाबेस से बहुत अधिक डेटा ला रहे हैं। यह एक वैध समाधान हो सकता है, लेकिन पहले एक प्रदर्शन अध्ययन की आवश्यकता है।
जोहो मेन्घिन

1
यदि आप जानते हैं कि आप मॉडल हैं, और अभ्यस्त से संबंधित कई संस्थाएँ हैं, तो आप पूर्ण निकाय प्राप्त करने के लिए थोड़े मेम और परफॉमेंस खर्च कर सकते हैं। लेकिन यह जानना हमेशा अच्छा होता है कि आप हमेशा LAZY
भ्रूण का

0

यह जैक्सन के साथ एक मुद्दा है। इसे रोकने के लिए, जैक्सन को नेस्टेड रिलेशनशिप या नेस्टेड क्लास को सीरियस न करने का निर्देश दें।

निम्नलिखित उदाहरण देखें। पता वर्ग को शहर , राज्य और देश की कक्षाओं में मैप किया जाता है और राज्य स्वयं देश और देश को इंगित करता है। जब आपको स्प्रिंग बूट REST API के माध्यम से एड्रेस वैल्यू मिलती है तो आपको उपरोक्त त्रुटि मिलेगी। इसे रोकने के लिए, केवल मैप्ड क्लास (जो एक स्तर JSON को दर्शाती है) को अनुक्रमित करें और साथ @JsonIgnoreProperties(value = {"state"}), @JsonIgnoreProperties(value = {"country"})और के साथ नेस्टेड संबंधों को अनदेखा करें @JsonIgnoreProperties(value = {"region"})

यह उपरोक्त त्रुटि के साथ ही Lazyload अपवाद को रोक देगा। एक उदाहरण के रूप में नीचे दिए गए कोड का उपयोग करें और अपनी मॉडल कक्षाएं बदलें।

Address.java

@Entity
public class Address extends AbstractAuditingEntity
{
    private static final long serialVersionUID = 4203344613880544060L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @Column(name = "street_name")
    private String streetName;

    @Column(name = "apartment")
    private String apartment;

    @ManyToOne
    @JoinColumn(name = "city_id")
    @JsonIgnoreProperties(value = {"state"})
    private City city;

    @ManyToOne
    @JoinColumn(name = "state_id")
    @JsonIgnoreProperties(value = {"country"})
    private State state;

    @ManyToOne
    @JoinColumn(name = "country_id")
    @JsonIgnoreProperties(value = {"region"})
    private Country country;

    @ManyToOne
    @JoinColumn(name = "region_id")
    private Region region;

    @Column(name = "zip_code")
    private String zipCode;

    @ManyToOne
    @JoinColumn(name = "address_type_id", referencedColumnName = "id")
    private AddressType addressType;

}

City.java

@EqualsAndHashCode(callSuper = true)
@Entity
@Table(name = "city")
@Cache(region = "cityCache",usage = CacheConcurrencyStrategy.READ_WRITE)
@Data
public class City extends AbstractAuditingEntity
{
    private static final long serialVersionUID = -8825045541258851493L;

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    //@Length(max = 100,min = 2)
    private String name;


    @ManyToOne
    @JoinColumn(name = "state_id")
    private State state;
}

State.java

@Entity
@Table(name = "state")
@Data
@EqualsAndHashCode(callSuper = true)
public class State extends AbstractAuditingEntity
{
    private static final long serialVersionUID = 5553856435782266275L;

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "code")
    private String code;

    @Column(name = "name")
    @Length(max = 200, min = 2)
    private String name;

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "country_id")
    private Country country;

}

Country.java

@Entity
@Table(name = "country")
@Data
@EqualsAndHashCode(callSuper = true)
public class Country extends AbstractAuditingEntity
{
    private static final long serialVersionUID = 6396100319470393108L;

    @Id
    @Column(name = "id")
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "name")
    @Length(max = 200, min = 2)
    private String name;

    @Column(name = "code")
    @Length(max = 3, min = 2)
    private String code;

    @Column(name = "iso_code")
    @Length(max = 3, min = 2)
    private String isoCode;

    @ManyToOne
    @JoinColumn(name = "region_id")
    private Region region;
}

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