Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/spring-boot/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JPA和Lombok导致循环依赖中的StackOverflower错误_Java_Spring Boot_Jpa_Lombok_Circular Dependency - Fatal编程技术网

Java JPA和Lombok导致循环依赖中的StackOverflower错误

Java JPA和Lombok导致循环依赖中的StackOverflower错误,java,spring-boot,jpa,lombok,circular-dependency,Java,Spring Boot,Jpa,Lombok,Circular Dependency,我有两个实体类: @Data @Entity(name = "user") @Table(name = "tbl_user") @EqualsAndHashCode(callSuper = true, exclude = "products") public class UserEntity extends BaseEntity { @Column(unique = true) private String usern

我有两个实体类:

@Data
@Entity(name = "user")
@Table(name = "tbl_user")
@EqualsAndHashCode(callSuper = true, exclude = "products")
public class UserEntity extends BaseEntity {

    @Column(unique = true)
    private String username;

    @ToString.Exclude
    private String password;

    @Transient
    @JsonProperty("remember_me")
    private Boolean rememberMe;

    @Enumerated(EnumType.STRING)
    @CollectionTable(name = "tbl_user_role")
    @ElementCollection(fetch = FetchType.EAGER)
    Set<Role> roles = new HashSet<>();

    @OneToMany(mappedBy = "user", fetch = FetchType.EAGER, cascade = CascadeType.ALL)
    private List<ProductEntity> products = new ArrayList<>();
}
扩展baseEntity的两种方法:

@MappedSuperclass
public abstract class BaseEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Version
    private long version;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        BaseEntity that = (BaseEntity) o;
        return Objects.equals(id, that.id) && Objects.equals(version, that.version);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, version);
    }
}
现在,当我尝试检索所有产品(或所有用户)(例如
findAll
方法)时,我得到一个
stackoverflowerrror
。 我知道这个错误是由用户和产品之间的循环依赖关系引起的,所以我在userEntity中的equals注释中添加了一个exclude来解决它,就像这样:

@EqualsAndHashCode(callSuper=true,exclude=“products”)


不幸的是,错误不断出现。我在这里缺少什么?

我通过向
角色和
用户
类变量添加
@ToString.Exclude
解决了这个问题。显然,我后来在代码中的某个地方打印了它们,这导致了错误。

请注意,一般来说,覆盖实体的
equals
hashCode
不是一个好主意。将实体与值区分开来的具体特征是,实体具有独立于其数据的标识。
@MappedSuperclass
public abstract class BaseEntity implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private long id;

    @Version
    private long version;

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        BaseEntity that = (BaseEntity) o;
        return Objects.equals(id, that.id) && Objects.equals(version, that.version);
    }

    @Override
    public int hashCode() {
        return Objects.hash(id, version);
    }
}