我正在做一些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)上的这一细节
希望对您有帮助!