我正在做一些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
值@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;
}
请求参数中的1}}对象,如下所示:
hashCode
这是一种错误或低效的方法吗?我已经读过,在覆盖equals
时覆盖override
始终是最佳做法,但我不知道在这种情况下是否需要它/如何实现它。
谢谢。
答案 0 :(得分:2)
如果您使用生成的ID(这是您的情况),依赖于数据库标识符比较(在您的情况下为petId
)可能会让您遇到麻烦。想一想;在保存对象之前,不会设置标识符值。只有在瞬态对象上调用session.save()
时才会设置它,使其持久化。
如果您使用手动分配的ID,我们可以说您没有遇到麻烦,您只需确保在将对象添加到集合之前设置标识符值。
此外,您必须考虑您要为该特定实体/对象实现的目标。可能还有其他字段(通常就是这种情况),您可以依赖它来查看该对象是否可以不同。
例如,假设您将equals
和hashCode
合同基于实体ID,并且您正在为Person {id, first_name, last_name, ssn}
对象建模。如果我为两条记录提供相同的first_name
,last_name
和ssn
,那么它们是否相等?但是因为你只考虑实体ID,所以不会。
关于覆盖equals
和hashCode
,Hibernate has a nice(但很长)说明如何操作以及何时执行此操作。
答案 1 :(得分:1)
我认为哪个不错或没有效率。
下面是您的模型:
@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:在我的情况下,模型称为组件。
PS。 2:......但是,为什么你想知道你的模型是否存在? Spring Boot中的存储库关注方法.save(Object object)
上的详细信息我希望能帮到你!