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);
}
}