我的项目中有很多实体类,并且不覆盖每个实体类中的 equals 和 hashcode,我想从实现这些方法的父类扩展它。因为实体类 equals 和 hashcode 应该基于其 ID 字段,因为它对于每个实例都是唯一的。
@NoArgsConstructor
@Getter
@Setter
public abstract class ParentEntity<ID> {
private ID id;
@Override
public boolean equals(final Object o) {
if (this == o) {
return true;
}
if (o == null || getClass() != o.getClass()) {
return false;
}
ParentEntity<?> that = (ParentEntity<?>) o;
return Objects.equals(id, that.id);
}
@Override
public int hashCode() {
return Objects.hash(id);
}
}
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
public class ChildEntity extends ParentEntity<Long> {
private Long id;
private String name;
}
但是当我测试它时:
ChildEntity childEntity = new ChildEntity(4L, "Cheese");
ChildEntity childEntity1 = new ChildEntity(4L, "Bread");
ChildEntity childEntity2 = new ChildEntity(1L, "Milk");
System.out.println(childEntity.equals(childEntity1)); // output true
System.out.println(childEntity.equals(childEntity2)); // output true
在调试中,我看到每个子实体实例中的 ParentEntity.id 均为 null,但我不明白为什么会这样。 请帮忙
如果子类中确实需要
private Long id;
,请将其命名为其他名称,而不是与超类中的另一个字段同名。