我正在做一些Springboot开发,想知道是否可以安全地仅覆盖equals方法来确定相等性。具体来说,相等性依赖于petId类(用Pet注释)的@Entity字段:

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "PET_ID", unique = true, nullable = false)
    private long petId;
   /*getters and setters*/


我对此进行了测试,并且可以正常工作。想法是,使用此唯一的数据库生成的ID,我可以基于包含正确构成的petId对象的PUT调用传递的Pet值,使用相等性来确定是更新现有记录还是创建新记录。在request参数中,如下所示:

@CrossOrigin()
    @RequestMapping(value = "/equalitytest", method = RequestMethod.PUT, produces = MediaType.APPLICATION_JSON_VALUE)
    public @ResponseBody Pet getEquality(@RequestBody Pet inputPet) {

        Pet res = null;

        List<Pet> pets = petRepo.findAll();

        for (Pet p : pets) {

            if (inputPet.equals(p)) {
                res = p;
            }
        }

        return res;
    }


这是错误的还是效率低下的方法?我已经读到,总是最好的做法是,每当覆盖hashCode时都覆盖equals,但是我不知道在这种情况下/是否应该实现它。

谢谢。

最佳答案

我认为这没错或效率不高。

下面是适合您的模型:

@Override
public int hashCode() {
    int hash = 0;
    hash += (componentId != null ? componentId.hashCode() : 0);
    return hash;
}

@Override
public boolean equals(Object object) {
    // TODO: Warning - this method won't work in the case the componentId fields are not set
    if (!(object instanceof Component)) {
        return false;
    }
    Component other = (Component) object;
    if ((this.componentId == null && other.componentId != null) || (this.componentId != null && !this.componentId.equals(other.componentId))) {
        return false;
    }
    return true;
}

@Override
public String toString() {
    return "com.example.model.Component[ id=" + componentId + " ]";
}


PS。 1:在我的情况下,该模型称为Component。

PS。 2:...但是,为什么要知道您的模型是否存在? Spring Boot中的存储库负责方法.save(Object object)上的这一细节

希望对您有帮助!

09-30 15:40