Tôi có một dịch vụ web với các tệp lớp Java đã được tạo bằng NetBeans dựa trên lược đồ cơ sở dữ liệu mà tôi có.SAXException2: Một chu trình được phát hiện trong biểu đồ đối tượng. Trường hợp là gì?
tôi nhận được ngoại lệ kỳ lạ và đôi khi một trong số họ là một trong những điều này:
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 ]]
Tôi có googled ngoại lệ này và phát hiện một số trường hợp simillar nhưng tôi vẫn không thể hiểu được vấn đề. Tôi vừa tạo ra các lớp đó (Person.java, Team.java, TeamPerson.java) với NetBeans để làm thế nào vấn đề có thể xảy ra?
Điều này xảy ra khi tôi cố gắng để có được tất cả những người:
Iterator iter = team.getTeamPersonCollection().iterator();
while(iter.hasNext()) {
Person person = ((TeamPerson)iter.next()).getPerson();
...
}
EDIT
Nếu tôi loại bỏ các tài liệu tham khảo Đội bóng từ TeamPerson tôi nhận được lỗi sau:
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
Các phần của các lớp được tạo sẽ trông giống như sau:
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;
Xin chào @Rox, cuối cùng bạn có giải quyết được vấn đề này không? Tôi cũng vậy! – LppEdd