2013-06-19 9 views
7

में कई-से-एक परिणाम हैं मेरे पास उपयोगकर्ता और GrantedRole इकाइयां हैं जिनके पास एक-से-कई संबंध हैं।जेपीए/हाइबरनेट बिडरेक्शनल स्टैकओवरफ्लोएक्सप्शन

जब मैं उपयोगकर्ता में सेट करने के लिए एक GrantedRole जोड़ने का प्रयास करते हैं, वहाँ कोई अपवाद नहीं फेंक दिया जाता है, लेकिन जब मैं उपयोगकर्ता और GrantedRole वस्तु के लिए चर डिबग एक वर्णन है कि

com.sun.jdi.InvocationException occurred invoking method.

विभिन्न क्षेत्रों पढ़ता है डिबगिंग के दौरान चर को पढ़ा जा सकता है, लेकिन जब मैं उपयोगकर्ता में भूमिका क्षेत्र का चयन करता हूं या GrantedRole में उपयोगकर्ता फ़ील्ड को ऊपर जैसा ही विवरण मिलता हूं। जब मैं उपयोगकर्ता में GrantedRole के सेट में जाते हैं, मैं अंत में निम्नलिखित विवरण लगता है:

Detail formatter error: An exception occurred: java.lang.StackOverflowError

मेरे कोड:

public class User { 
    private Set<GrantedRole> roles = new HashSet<GrantedRole>(); 

    public User() { 
     super(); 
    } 
    public User(String name, String password) { 
     this.name = name; 
     this.password = password; 
    } 

    @OneToMany(fetch = FetchType.EAGER, mappedBy = "user") 
    public Set<GrantedRole> getRoles() { 
     return roles; 
    } 

    public void setRoles(Set<GrantedRole> roles) { 
     this.roles = roles; 
    } 

    // equals and hashCode are based on username 
    // toString is based on all fields 
} 

public class GrantedRole { 
    private user user; 

    public GrantedRole() { 
     super(); 
    } 
    public GrantedRole(User user, Role role, Organization organization) { 
     this.user = user; 
     this.role = role; 
     this.organization = organization; 
    } 

    @ManyToOne 
    @NotNull 
    public User getUser() { 
     return user; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 

    // equals and hashCode are based on all fields 
    // toString was based on all fields, I've changed it to not include User. 
} 

public class Test { 
    public void testStuff() { 
     User user = new User("name"); 
     GrantedRole role = new GrantedRole(user, "role"); //this sets the user field 
     user.getRoles().add(role); //doesn't throw Exception, but debugging shows InvocationTargetException and StackOverflowException 
     System.out.println(user.getRoles()); //throws StackOverflowException, as I would expect 
    } 
} 

यह मेरी समझ है कि मैं एक द्विदिश स्थापित करने के लिए सक्षम होना चाहिए था इस तरह से संबंध। मैंने कई ट्यूटोरियल, like this one पढ़ा है, और मैं नहीं देखता कि मैं .add (भूमिका) गलत होने के कारण अलग-अलग क्या कर रहा हूं।

यदि आवश्यक हो तो मैं कुछ मामूली कोड छोड़ देता हूं, मैं खुशी से इसे प्रदान करूंगा। मैंने यह सुनिश्चित करने के लिए कोड नहीं बनाया है कि किसी उपयोगकर्ता के संदर्भ के साथ एक GrantedRole उस उपयोगकर्ता द्वारा बदले में संदर्भित किया गया है, लेकिन मुझे लगता है कि मेरे पास होने वाली समस्या के लिए प्रासंगिक नहीं है।

+0

1. क्या गेटर्स/सेटर्स वास्तव में तुच्छ हैं? 2. 'स्टैक ओवरफ्लो एरर' का पूरा ढेर क्या हो रहा है यह समझने में बहुत मदद करेगा। –

+0

और आप दोनों रचनाकारों, 'उपयोगकर्ता (स्ट्रिंग)' और 'GrantedRole (उपयोगकर्ता, स्ट्रिंग)' का कोड जोड़ सकते हैं, ताकि हम समझ सकें कि आप वास्तव में क्या कर रहे हैं। – eternay

+2

यह 'toString()' विधि रिकर्सिव कॉल हो सकता है। आपको यह सुनिश्चित करना चाहिए कि आप माता-पिता से बच्चे से 'बराबर', 'हैशकोड', ... जैसी विधियों को कॉल न करें, केवल बच्चे को माता-पिता से कॉल करने में रुचि होनी चाहिए। –

उत्तर

15

तो, मैं सिर्फ बेवकूफ था और toString() विधियों में एक रिकर्सिव कॉल था। User.toString() ने भूमिकाओं को मुद्रित करने का प्रयास किया, और GrantedRole.toString() ने उपयोगकर्ता को मुद्रित करने का प्रयास किया।

मैंने user.getUsername() को मुद्रित करने के लिए GrantedRole.toString() को बदलकर इसे ठीक किया है, इस प्रकार चक्र को तोड़ दिया है।

+2

आपके .hashCode() विधि के साथ भी ऐसा ही हो सकता है :) –

+0

धन्यवाद, अच्छा जवाब – FAndrew

+1

धन्यवाद, इस स्टैक ओवरफ्लो समस्या के साथ एक से एक दिन तक एक से अधिक बोली लगाने के लिए अटक गया। टॉस्ट्रिंग को संशोधित करके समस्या को हल किया गया() –

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