2012-05-14 13 views
6

Mam usługę sieci web z plikami klasy Java, które zostały wygenerowane przy użyciu NetBeans na podstawie posiadanego schematu bazy danych.SAXException2: Wykryto cykl na wykresie obiektu. O co chodzi?

otrzymuję dziwne wyjątki czasami i jednym z nich jest to jedno:

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 ]] 

Mam googled ten wyjątek i znaleźć kilka zblizonym przypadki ale nadal nie mogę zrozumieć problem. Właśnie wygenerowałem te klasy (Person.java, Team.java, TeamPerson.java) z NetBeans, więc w jaki sposób może wystąpić problem?

Dzieje się tak, gdy próbuję uzyskać wszystkie osoby:

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

EDIT
Jeśli usunąć odniesienie zespół z TeamPerson pojawia się następujący błąd:

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) 

EDIT 2
części generowanych klas wygląda następująco:

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

Witaj @Rox, czy rozwiązałeś ten problem w końcu? Mam to samo! – LppEdd

Odpowiedz

0

Więc może to jest to, to dlatego, że klasa Person zawiera pole typu TeamPerson i TeamPerson zawiera pole typu Person. A marshaller jest zdezorientowany podczas analizowania takiej pętli init?

UPD. Może trzeba zmienić ten

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

do:

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

ponieważ pole team nie istnieje w klasie TeamPerson?

+0

Jeśli usuniesz odniesienie do Teamu od TeamPerson, otrzymam inny wyjątek. Zobacz moją edycję powyżej. Jak mogę to rozwiązać? – Rox

+0

zaktualizował odpowiedź. –

+0

Nie wiem, klasa została wygenerowana w ten sposób, 'mappedBy =" team "'. Nie pytaj mnie dlaczego, ale jeśli zmienię na "teamId", dostaję wyjątek ValidationException: 'Napotkano niekompatybilne mapowanie między [class org.mylib.Person] a [class org.mylib.TeamPerson] Zwykle występuje, gdy liczność mapowania nie odpowiada liczności backpointer. "Jakieś inne sugestie? – Rox

10

Rozwiązaniem jest dodanie adnotacji: "@XmlTransient" (javax.xml.bind.annotation.XmlTransient) do pobierającego właściwość, która powoduje cykl.

+1

Obiekt jest wymagany jako część zwróconego JSON @ XmlTransient wyklucza go całkowicie – Paullo

+0

użytkownik chce, aby dane były częścią JSON –

Powiązane problemy