Eclipse SpringBoot@OneToMany无限循环,带Lombok
我的项目使用SpringBoot,它具有双向映射@OneToManyEclipse SpringBoot@OneToMany无限循环,带Lombok,eclipse,spring-boot,hibernate,Eclipse,Spring Boot,Hibernate,我的项目使用SpringBoot,它具有双向映射@OneToMany @Entity @Table(name = "T_S") @Getter @Setter @EqualsAndHashCode @NoArgsConstructor @AllArgsConstructor @ToString public class S implements Serializable { @OneToMany(fetch = FetchType.LAZY, casc
@Entity
@Table(name = "T_S")
@Getter
@Setter
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class S implements Serializable {
@OneToMany(fetch = FetchType.LAZY, cascade = CascadeType.MERGE)
@JoinColumn(name = "something", referencedColumnName = "A_ID", nullable = false, insertable = false, updatable = false)
@OptimisticLock(excluded = false)
private Set<A> act = new HashSet<>();
....something...
}
@Entity
@Table(name = "T_A")
@Getter
@Setter
@EqualsAndHashCode
@NoArgsConstructor
@AllArgsConstructor
@ToString
public class A{
@ManyToOne(optional = true, fetch = FetchType.LAZY)
@JoinColumn(name = "A_ID", insertable = false, updatable = false)
private S sub;
}
@实体
@表(name=“T_S”)
@吸气剂
@塞特
@EqualsAndHashCode
@诺尔格构装师
@AllArgsConstructor
@托斯特林
公共类S实现可序列化{
@OneToMany(fetch=FetchType.LAZY,cascade=CascadeType.MERGE)
@JoinColumn(name=“something”,referencedColumnName=“A_ID”,nullable=false,insertable=false,updateable=false)
@OptimisticLock(排除=错误)
private Set act=新HashSet();
某物
}
@实体
@表(name=“T_A”)
@吸气剂
@塞特
@EqualsAndHashCode
@诺尔格构装师
@AllArgsConstructor
@托斯特林
公共A类{
@manytone(可选=true,fetch=FetchType.LAZY)
@JoinColumn(name=“A_ID”,insertable=false,updateable=false)
私人秘书分处;
}
当我从存储库中获取数据时,它会进行不定循环。如何修复它?我通过覆盖实体A中的三种方法
hashCode
,toString
,equals
解决了这个问题
@Override
public int hashCode() {
//something
}
@Override
public String toString() {
//something
}
@Override
public boolean equals(Object obj) {
//something
}
不要将Lombok与JPA实体一起使用。toString()执行无限循环
其他方法是,重写多个实体的toString以返回“”。如果您具有双向关系Lombok equals,
hashCode和toString将创建StackOverflowerError 因此,删除@ToString和@EqualsAndHashCode 我是general equals,在使用JPA时,哈希代码应该在唯一的业务密钥上实现
另一种方法是从Lombok中排除某些属性。我认为这是一个很好的解决方案,或者我们可以@overide两种方法您可以指定在
toString
中使用哪些字段,或者使用@Lombok.toString.exclude
注释排除特定字段,这样它就不会再进行无限循环了。