title: SAXException2: A cycle is detected in the object graph. What is the case?
body: <p>I have a web-service with Java class files that have been generated with NetBeans based on the database schema I have. </p>
  
  <p>I get strange exceptions sometimes and one of them is this one: </p>
  
  <pre><code>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 ] -&gt;org.mylib.TeamPerson[ teamPersonPK=org.mylib.teamPersonPK[ teamId=1, personId=1 ] ] -&gt; org.mylib.Person[ personId=1 ]]
  </code></pre>
  
  <p>I have googled this exception and found some simillar cases but I still cannot understand the problem. I have just generated those classes (Person.java, Team.java, TeamPerson.java) with NetBeans so how can the problem occur?</p>
  
  <p>This happens when I try to get all Persons:</p>
  
  <pre><code>Iterator iter = team.getTeamPersonCollection().iterator();
  while(iter.hasNext()) {
              Person person = ((TeamPerson)iter.next()).getPerson();
  ...
  }
  </code></pre>
  
  <p><strong>EDIT</strong><br />
  If I remove the Team reference from TeamPerson I get the following error:</p>
  
  <pre><code>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)
  </code></pre>
  
  <p><strong>EDIT 2</strong><br />
  Parts of the generated classes looks like this:</p>
  
  <p>Team.java   </p>
  
  <pre><code>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&lt;TeamPerson&gt; teamPersonCollection;
  </code></pre>
  
  <p>Person.java</p>
  
  <pre><code>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&lt;TeamPerson&gt; teamPersonCollection;
  </code></pre>
  
  <p>TeamPerson.java</p>
  
  <pre><code>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;
  </code></pre>
  
  <p>TeamPersonPK.java</p>
  
  <pre><code>@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;
  </code></pre>