【发布时间】:2017-07-31 04:49:50
【问题描述】:
我正在做一些 Springboot 开发,想知道是否只覆盖 equals 方法以确定相等性是否安全。具体来说,相等性依赖于Pet 类的petId 字段(使用@Entity 注释):
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
@Column(name = "PET_ID", unique = true, nullable = false)
private long petId;
/*getters and setters*/
我对此进行了测试,它可以工作。这个想法是,使用这个唯一的数据库生成 ID,我可以使用相等性来确定是更新现有记录还是创建新记录,基于从 PUT 调用传入的包含正确格式的 Pet 对象的 petId 值在请求参数中,如下:
@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;
}
这是一种错误或低效的方法吗?我已经读过,当equals 被覆盖时,覆盖hashCode 始终是最佳做法,但我不知道在这种情况下是否需要这样做/应该如何实现。
谢谢。
【问题讨论】:
-
始终同时覆盖
equals、hashCode、toString和compareTo(如果使用)。我建议遵循良好的面向对象实践,使用自然键来表示相等。远离对象模型中的人工“id”字段。 -
自然键本身可以更新时如何使用它们?例如,
Pet类中还有两个字段,称为petName和petOwner,并且可以根据与另一个对象的petId字段确定的相等性来更新其中的任何一个。
标签: java spring-boot spring-data-jpa