2012-05-14 9 views
6

मेरे पास जावा क्लास फाइलों के साथ एक वेब-सेवा है जो नेटबीन के साथ जेनरेट की गई है जो मेरे पास डेटाबेस स्कीमा के आधार पर है।SAXException2: ऑब्जेक्ट ग्राफ़ में एक चक्र का पता लगाया गया है। मामला क्या है?

मैं अजीब अपवाद कभी कभी मिलता है और उनमें से एक यह एक है:

javax.xml.ws.WebServiceException: javax.xml.bind.MarshalException 
- with linked exception: 
[com.sun.istack.internal.SAXException2: A cycle is detected in the object graph. This will cause infinitely deep XML: org.mylib.Person[ personId=1 ] ->org.mylib.TeamPerson[ teamPersonPK=org.mylib.teamPersonPK[ teamId=1, personId=1 ] ] -> org.mylib.Person[ personId=1 ]] 

मैं इस अपवाद googled और कुछ simillar मामलों में पाया गया लेकिन मैं अभी भी समस्या नहीं समझ सकता है। मैंने नेटबीन के साथ उन वर्गों (Person.java, Team.java, TeamPerson.java) को अभी जेनरेट किया है, तो समस्या कैसे हो सकती है?

यह तब होता है जब मैं सभी व्यक्तियों प्राप्त करने की कोशिश: यदि मैं टीम संदर्भ TeamPerson से मैं निम्नलिखित त्रुटि मिलती है हटाने

Iterator iter = team.getTeamPersonCollection().iterator(); 
while(iter.hasNext()) { 
      Person person = ((TeamPerson)iter.next()).getPerson(); 
... 
} 

संपादित
:

Internal Exception: Exception [EclipseLink-7154] (Eclipse Persistence Services - 2.2.0.v20110202-r8913): org.eclipse.persistence.exceptions.ValidationException 
Exception Description: The attribute [teamPersonCollection] in entity class [class org.mylib.Team] has a mappedBy value of [team] which does not exist in its owning entity class [org.mylib.TeamPerson]. If the owning entity class is a @MappedSuperclass, this is invalid, and your attribute should reference the correct subclass. 
    at org.eclipse.persistence.exceptions.PersistenceUnitLoadingException.exceptionSearchingForPersistenceResources(PersistenceUnitLoadingException.java:126) 

संपादित करें 2
जेनरेट किए गए वर्गों के भाग इस तरह दिखते हैं:

Team.java

public class Team implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @Column(name = "team_id") 
    private Integer teamId; 
    @Column(name = "type") 
    private String type; 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "team") 
    private Collection<TeamPerson> teamPersonCollection; 

Person.java

public class Person implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @Id 
    @Basic(optional = false) 
    @Column(name = "person_id") 
    private Integer personId; 
    @Column(name = "name") 
    private String name; 
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "person") 
    private Collection<TeamPerson> teamPersonCollection; 

TeamPerson.java

public class TeamPerson implements Serializable { 
    private static final long serialVersionUID = 1L; 
    @EmbeddedId 
    protected TeamPersonPK teamPersonPK; 
    @Basic(optional = false) 
    @Column(name = "timestamp") 
    @Temporal(TemporalType.TIMESTAMP) 
    private Date timestamp; 
    @JoinColumn(name = "team_id", referencedColumnName = "team_id", insertable = false, updatable = false) 
    @ManyToOne(optional = false) 
    private Team team; 
    @JoinColumn(name = "person_id", referencedColumnName = "person_id", insertable = false, updatable = false) 
    @ManyToOne(optional = false) 
    private Person person; 

TeamPersonPK.java

@Embeddable 
public class TeamPersonPK implements Serializable { 
    @Basic(optional = false) 
    @Column(name = "team_id") 
    private int teamId; 
    @Basic(optional = false) 
    @Column(name = "person_id") 
    private int personId; 
+0

हाय @ रोक्स, क्या आपने अंत में इस समस्या को हल किया? मुझे वही मिला! – LppEdd

उत्तर

0

वैसे शायद ऐसा इसलिए है क्योंकि आपकी Person कक्षा में TeamPerson का क्षेत्र शामिल है और TeamPerson में Person प्रकार का क्षेत्र शामिल है। और मार्शलर इस तरह के लूप इनिट पार्सिंग उलझन में है?

यूपीडी। हो सकता है आप को बदलने की जरूरत इस

@OneToMany(cascade = CascadeType.ALL, mappedBy = "team") 
    private Collection<TeamPerson> teamPersonCollection; 
को

:

@OneToMany(cascade = CascadeType.ALL, mappedBy = "teamId") 
    private Collection<TeamPerson> teamPersonCollection; 

क्योंकि क्षेत्र team वर्ग TeamPerson में मौजूद नहीं है?

+0

यदि टीमपर्सन से टीम के संदर्भ को हटा दें तो मुझे एक और अपवाद मिलता है। ऊपर मेरा संपादन देखें। मैं इसे कैसे हल कर सकता हूं? – Rox

+0

उत्तर अद्यतन किया गया। –

+0

मुझे नहीं पता, कक्षा उस तरह उत्पन्न हुई थी, 'मैप्डबी = "टीम" '। मुझसे मत पूछो क्यों, लेकिन अगर मैं 'टीम आईडी' में बदल जाता हूं तो मुझे एक सत्यापन प्राप्त होता है: '[कक्षा org.mylib.Person] और [class org.mylib.TeamPerson] के बीच एक असंगत मैपिंग का सामना करना पड़ा है यह आमतौर पर तब होता है जब यह आमतौर पर होता है मैपिंग की कार्डिनालिटी बैकपोइंटर की कार्डिनालिटी के अनुरूप नहीं है। 'कोई अन्य सुझाव? – Rox

10

समाधान एनोटेशन जोड़ने के लिए है: "@XmlTransient" (javax.xml.bind.annotation.XmlTransient) चक्र के कारण होने वाली संपत्ति के प्राप्तकर्ता पर।

+1

लौटा JSON @XmlTransient के हिस्से के रूप में ऑब्जेक्ट की आवश्यकता है इसे पूरी तरह से – Paullo

+0

को छोड़कर उपयोगकर्ता चाहता है कि डेटा JSON का हिस्सा बन जाए –

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