今天在项目中同时使用 lombok 中的 @Data 注解与 hibernate 时出现了一个bug
在运行的时候报错 org.hibernate.engine.loading.internal.CollectionLoadContext@6b6f68cdrs=com.alibaba.druid.pool.Druid?
@Data
@NoArgsConstructor
@Entity
@Table(name = "sys_user")
public class User extends BaseEntity {
@Id
@GeneratedValue(generator = "nativeStrategy")
@GenericGenerator(name = "nativeStrategy", strategy = "native")
private Integer id;
.....
@OneToMany(mappedBy = "user", cascade = CascadeType.REMOVE, fetch = FetchType.LAZY)
private Set userRoles = new HashSet();
.....
}
问题处理
问题定位:查阅了一些资料,其实这里为什么报这个错,是 @Data 注解的问题
问题原因:@Data 注解包含了 @Getter、@Setter、@RequiredArgsConstructor、@ToString、@EqualsAndHashCode等注解,即使用当前注解时会自动生成包含的这五个注解对应所有方法,正是这里的 @EqualsAndHashCode 是问题所在。不了解 lombok 的可以查看 lombok 的使用
问题依据:
官网 lombok hashandcode 有这么一段文字
翻译过来是:数组是"深度"比较/hashCoded,这意味着包含自己的数组将导致StackOverflowError
而在上述的 User 类中,有一个 Set
问题处理:
1、去除 @Data 注解,根据使用,我这边替换成了 @Getter 与 @Setter (无需 @EqualsAndHashCode)
2、若需要equals 与 hashCode,自己在 User类中重写 hashCode 与 equals 方法即可,不用其默认实现的方式进行比较
@Override
public int hashCode() {
// 自己的实现
return super.hashCode();
}
@Override
public boolean equals(Object obj) {
// 自己的实现
return super.equals(obj);
}



