What is @EqualsAndHashCode

@Getter
@Setter
@EqualsAndHashCode
public class MaestroRequestDTO {

    private Long initiativeId;
    private NAME_1 initiativeName;
    private NAME_1 subsectorCode;
    private NAME_1 subsectorName;
    private NAME_1 regionName;
    private NAME_1 regionCode;
    private NAME_1 scope;
    private NAME_1 primaryIlIonName;
    private List<NAME_1> ilIonName;
    private List<NAME_1> iolIonName;
    private List<NAME_1> artworkPlannerIonName;
    @Getter(value = AccessLevel.NONE)
    @Setter(value = AccessLevel.NONE)
    private List<NAME_1> cAceIonName;
    private NAME_1 statusOfInitiative;
    private Boolean lineUpLock;

    List<PiPackMaterialDTO> pmps;

    public MaestroRequestDTO() {
    }

    public MaestroRequestDTO(InitiativeDTO initiativeDTO) {
        this.initiativeId = initiativeDTO.getId();
        this.initiativeName = initiativeDTO.getName();
        if (isNotEmpty(initiativeDTO.getSubsector())) {
            this.subsectorCode = initiativeDTO.getSubsector().get(0);
        }
        this.subsectorName = initiativeDTO.getSubsectorName();
        this.regionName = initiativeDTO.getGeoName();
        this.regionCode = initiativeDTO.getGeoCode();
        this.scope = initiativeDTO.getScopeName();
        this.statusOfInitiative = initiativeDTO.getStatus().name();
        this.lineUpLock = initiativeDTO.isLineUpLocked();
    }

    public List<NAME_1> getcAceIonName() {
        return cAceIonName;
    }

    public void setcAceIonName(List<NAME_1> cAceIonName) {
        this.cAceIonName = cAceIonName;
    }

    public boolean hasPmps() {
        return notEmpty(pmps);
    }

    public void modifyUsingHistoricalData(MaestroRequestDTO maestroRequestDTO) {
        transformRequest(this, maestroRequestDTO);
    }

    private static void transformRequest(MaestroRequestDTO current, MaestroRequestDTO previous) {
        current.setPmps(processDataLevel(current.getPmps(), previous.getPmps(), PiPackMaterialDTO::getPiMaterialID, MaestroRequestDTO::packMaterial));
    }

    private static void poPackMaterials(PoPackMaterialDTO currentDto, PoPackMaterialDTO previousDto) {
        currentDto.setPoPoaApprovedCountries(processLeafDTO(currentDto.getPoPoaApprovedCountries(), previousDto.getPoPoaApprovedCountries()));
    }

    private static void poProducts(PoProductDTO currentDto, PoProductDTO previousDto) {
        currentDto.setPoFormulaCards(processLeafDTO(currentDto.getPoFormulaCards(), previousDto.getPoFormulaCards()));
        currentDto.setPoMaterials(processLeafDTO(currentD