2016-08-26 77 views
0

時,我有如下關係:堆棧溢出加載關係

@Data 
@EqualsAndHashCode(callSuper=true) 
public class Room extends BasePersistable { 

    private static final long serialVersionUID = 1L; 

    @Column(nullable=false) 
    private String uid; 

    @Column(nullable=false) 
    private String name; 

    @Column(nullable=true) 
    private String fullName; 

    @Column(nullable=true, length=500) 
    private String description; 

    @Column(nullable=true) 
    private String homepage; 

    @Column(nullable=false) 
    private String owner; 

    @ManyToOne 
    @JsonIgnoreProperties({"repos", "members"}) 
    private Organization organization; 

@Data 
@EqualsAndHashCode(callSuper=true) 
@JsonInclude(content=Include.NON_NULL) 
public class Organization extends BasePersistable { 
    private static final long serialVersionUID = -7119760968529447945L; 

    @Column(nullable=false) 
    @NotEmpty 
    private String name; 

    @Column(nullable=false, unique = true) 
    @NotNull 
    private Integer uid; 

    @Column 
    private String avatar; 

    @Column 
    private String blog; 

    @Column 
    private String company; 

    @Column(nullable=false) 
    @NotNull 
    private String login; 

    @Column(nullable=true) 
    private String location; 

    @OneToMany(mappedBy="organization") 
    @JsonIgnoreProperties({"users", "joined", "organization"}) 
    private List<Room> repos = new ArrayList<>(); 

,當我從一個特定的用戶負載的房間,我得到這個錯誤:

java.lang.StackOverflowError: null 
    at com.inkdrop.app.domain.models.Organization.hashCode(Organization.java:29) ~[classes/:na] 
    at com.inkdrop.app.domain.models.Room.hashCode(Room.java:34) ~[classes/:na] 
    at java.util.AbstractList.hashCode(AbstractList.java:541) ~[na:1.8.0_51] 
    at java.util.Vector.hashCode(Vector.java:992) ~[na:1.8.0_51] 
    at org.eclipse.persistence.indirection.IndirectList.hashCode(IndirectList.java:504) ~[org.eclipse.persistence.core-2.6.1.jar:na] 
    at com.inkdrop.app.domain.models.Organization.hashCode(Organization.java:29) ~[classes/:na] 
    at com.inkdrop.app.domain.models.Room.hashCode(Room.java:34) ~[classes/:na] 
    at java.util.AbstractList.hashCode(AbstractList.java:541) ~[na:1.8.0_51] 
    at java.util.Vector.hashCode(Vector.java:992) ~[na:1.8.0_51] 
    at org.eclipse.persistence.indirection.IndirectList.hashCode(IndirectList.java:504) ~[org.eclipse.persistence.core-2.6.1.jar:na] 
    at com.inkdrop.app.domain.models.Organization.hashCode(Organization.java:29) ~[classes/:na] 
    at com.inkdrop.app.domain.models.Room.hashCode(Room.java:34) ~[classes/:na] 
    at java.util.AbstractList.hashCode(AbstractList.java:541) ~[na:1.8.0_51] 
    at java.util.Vector.hashCode(Vector.java:992) ~[na:1.8.0_51] 
    at org.eclipse.persistence.indirection.IndirectList.hashCode(IndirectList.java:504) ~[org.eclipse.persistence.core-2.6.1.jar:na] 
    at com.inkdrop.app.domain.models.Organization.hashCode(Organization.java:29) ~[classes/:na] 
    at com.inkdrop.app.domain.models.Room.hashCode(Room.java:34) ~[classes/:na] 
.... 

我不確定問題是否與Eclipselink或Lombok所做的有關。

編輯:我注意到,有時它的工作(當我刪除整個數據庫)

+1

由於這是一個hashCode調用,所以檢查你的hashCode方法中的邏輯 - 它們看起來是遞歸的或者遍歷整個對象模型。您可能不想依賴任何集合屬性調用hashCode。 – Chris

+0

我正在使用lombok,所以我沒有真正負責實施 –

+0

無論如何,lombok有一個選項可以從計算中排除某些字段,這就實現了! –

回答

1

您可以添加exclude屬性您EqualsAndHashCode註釋。您的組織類的構造函數之前

@EqualsAndHashCode(callSuper = false, exclude={"repos"}) 

: 例如,從您的組織實體排除repos收集,使用。另外,如果有人正在閱讀此答案並恰好使用Hibernate,我建議您使用Set(而不是List)作爲您的收藏。除了避免可怕的MultipleBagFetchException之外,Set還允許您在實體中擁有多個急切加載的集合。它也允許你使用[left] join fetch加載多個集合,如果你想有時使用懶惰的v.s.急切的加載。