首页 > 解决方案 > Lombok EqualsAndHashCode 与继承

问题描述

我想使用 lombok:EqualsAndHashCode 只考虑 Id,在 Item 类上设置,在层次结构之上。这些是我的课程: 1.Process:

@Data
@Entity
@EqualsAndHashCode(callSuper = true, onlyExplicitlyIncluded = true)
@ToString(callSuper = true)
public class Process extends ResourceWithFlows {

  @OneToOne
  private Cost cost;
  private UUID referenceProduct; //flowBaseId
  private UUID processBaseId;
  private UUID processTemplateId;
  private boolean paretoApplied;

  //ref
  @ManyToOne
  @JoinColumn(name = "fk_equipment")
  private Equipment equipment;

  @ManyToOne
  @JoinColumn(name = "fk_production_line")
  private ProductionLine productionLine;

  @ManyToOne
  @JoinColumn(name = "fk_company")
  private Company company;

  @ManyToOne
  @JoinColumn(name = "fk_supply_chain")
  private SupplyChain supplyChain;

}

2.ResourceWithFlows:

@Data
@Entity
@EqualsAndHashCode(callSuper = true, onlyExplicitlyIncluded = true)
@ToString(callSuper = true)
public class ResourceWithFlows extends Resource {
    @OneToMany
    @JoinColumn(name = "fk_flow")
    private Set<Flow> flows;
    @OneToMany
    @JoinColumn(name = "fk_elementary_flow")
    private Set<ElementaryFlow> elementaryFlows;
    
}

3.项目:

@Data
@Entity
@EqualsAndHashCode(onlyExplicitlyIncluded = true)
@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS)
public class Item {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @EqualsAndHashCode.Include
    private UUID id;
    private String name;
    private LocalDateTime creationDate;
    @Lob
    private String description;
    @OneToOne
    private AuthUser creatorUser;

    @PrePersist
    void creationDate () {
        this.creationDate = LocalDateTime.now();;
    }

}

它是正确的还是有另一种方法来比较像进程这样的项目的子项?我在子项中使用了 callSuper=true 和 onlyExplicitlyIncluded=true ,在父项的 id 属性上设置了 @EqualsAndHashCode.Include ,但我不确定它是否正确。

标签: javaspringinheritancelombok

解决方案


您所做的确实有效,但鉴于您的要求,这似乎完全没有必要。如果您只打算使用id最顶层类中的字段来识别对象,则无需@EqualsAndHashCode在层次结构中的任何地方应用。生成的方法Item将适用于所有子类。


推荐阅读