java – SAXException2:在对象图中检测到循环.怎么回事?
发布时间:2020-12-14 05:44:04 所属栏目:Java 来源:网络整理
导读:我有一个Web服务,其中包含基于我拥有的数据库模式使用NetBeans生成的 Java类文件. 我有时会遇到奇怪的例外,其中一个就是这个: javax.xml.ws.WebServiceException: javax.xml.bind.MarshalException - with linked exception:[com.sun.istack.internal.SAXEx
我有一个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 ]] 我用google搜索了这个异常并找到了一些类似的情况,但我仍然无法理解这个问题.我刚刚使用NetBeans生成了这些类(Person.java,Team.java,TeamPerson.java),那么问题是如何发生的呢? 当我试图让所有人: 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",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; 解决方法
解决方案只是在导致循环的属性的getter中添加注释:“@XmlTransient”(javax.xml.bind.annotation.XmlTransient).
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |