SAXException2:在对象图中检测到一个循环.怎么回事?

Rox*_*Rox 6 java web-services sax

我有一个Web服务,其中包含基于我拥有的数据库模式使用NetBeans生成的Java类文件.

我有时会遇到奇怪的例外,其中一个就是这个:

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 ]]
Run Code Online (Sandbox Code Playgroud)

我用google搜索了这个异常并找到了一些类似的情况,但我仍然无法理解这个问题.我刚刚使用NetBeans生成了这些类(Person.java,Team.java,TeamPerson.java),那么问题是如何发生的呢?

当我试图让所有人:

Iterator iter = team.getTeamPersonCollection().iterator();
while(iter.hasNext()) {
            Person person = ((TeamPerson)iter.next()).getPerson();
...
}
Run Code Online (Sandbox Code Playgroud)

编辑
如果我从TeamPerson中删除Team引用,我会收到以下错误:

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)
Run Code Online (Sandbox Code Playgroud)

编辑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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

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;
Run Code Online (Sandbox Code Playgroud)

Lot*_*ion 10

解决方案只是添加注释:" @XmlTransient"(javax.xml.bind.annotation.XmlTransient)在导致循环的属性的getter.


Ale*_*aev 0

好吧,也许那是因为您的Person类包含 type 字段TeamPerson,并且TeamPerson包含 type 字段Person。编组器在解析这样的循环初始化时感到困惑?

UPD。也许你需要改变这个

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

到:

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

因为team类中不存在字段TeamPerson