2012-05-14 28 views
6

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; 
+0

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

Trả lời

0

Có lẽ đó là bởi vì lớp Person của bạn có chứa trường loại TeamPersonTeamPerson chứa trường loại Person. Và marshaller là bối rối un phân tích init vòng lặp như vậy?

UPD. Có lẽ bạn cần phải thay đổi điều này

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

tới:

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

vì lĩnh vực team không tồn tại trong lớp TeamPerson?

+0

Nếu xóa tham chiếu đến Nhóm khỏi TeamPerson, tôi sẽ nhận được một ngoại lệ khác. Xem chỉnh sửa của tôi ở trên. Làm thế nào tôi có thể giải quyết điều đó? – Rox

+0

đã cập nhật câu trả lời. –

+0

Tôi không biết, lớp được tạo ra như thế, 'mappedBy =" team "'. Đừng hỏi tôi tại sao, nhưng nếu tôi thay đổi thành 'teamId' tôi nhận được một ValidationException:' Một ánh xạ không tương thích đã gặp phải giữa [class org.mylib.Person] và [class org.mylib.TeamPerson] Điều này thường xảy ra khi cardinality của một ánh xạ không tương ứng với cardinality của backpointer của nó.' Bất kỳ đề xuất khác? – Rox

10

Giải pháp chỉ đơn giản là thêm chú thích: "@XmlTransient" (javax.xml.bind.annotation.XmlTransient) tại bộ nạp của thuộc tính gây ra chu trình.

+1

Đối tượng là bắt buộc khi một phần của JSON @XmlTransient trả về loại trừ hoàn toàn – Paullo

+0

người dùng muốn dữ liệu đó là một phần của JSON –

Các vấn đề liên quan