【问题标题】:stack overflow when loading relationship加载关系时堆栈溢出
【发布时间】:2016-08-26 08:30:32
【问题描述】:

我有以下关系:

@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 制作的东西有关。

编辑:我注意到有时它确实有效(当我删除整个数据库时)

【问题讨论】:

  • 由于这发生在 hashCode 调用中,请检查 hashCode 方法中的逻辑 - 它们似乎是递归的或遍历整个对象模型。您可能不想依赖在任何集合属性上调用 hashCode。
  • 我正在使用lombok,所以我并不真正负责实施
  • 无论如何,lombok 有一个选项可以从计算中排除某些字段,这就成功了!

标签: jpa eclipselink lombok


【解决方案1】:

您可以将exclude 属性添加到您的EqualsAndHashCode 注释中。 例如,要从您的组织实体中排除 repos 集合,请使用:

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

在您的组织类的构造函数之前。

另外,如果有人正在阅读此答案并且碰巧使用 Hibernate,我建议您使用 Set(而不是 List)作为您的收藏。除了避免可怕的MultipleBagFetchExceptionSet 还允许您在实体中拥有多个急切加载的集合。它还允许您使用[left] join fetch 加载多个集合,如果您有时想使用惰性v.s.急切加载。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-18
    • 2011-11-20
    • 2014-07-20
    • 2013-10-30
    • 2012-06-02
    • 1970-01-01
    • 2021-05-28
    • 2011-05-16
    相关资源
    最近更新 更多