Java 需要什么来确定@Entity类的相等性?
我正在进行Springboot开发,想知道是否可以安全地只覆盖Java 需要什么来确定@Entity类的相等性?,java,spring-boot,spring-data-jpa,Java,Spring Boot,Spring Data Jpa,我正在进行Springboot开发,想知道是否可以安全地只覆盖equals方法来确定相等性。具体而言,相等性取决于Pet类的petId字段(用@Entity注释): 我测试了这个,它是有效的。其思想是,使用这个唯一的数据库生成的ID,我可以根据请求参数中包含正确格式的Pet对象的PUT调用传入的petId值,使用等式来确定是更新现有记录还是创建新记录,如下所示: @CrossOrigin() @RequestMapping(value = "/equalitytest", method
equals
方法来确定相等性。具体而言,相等性取决于Pet
类的petId
字段(用@Entity
注释):
我测试了这个,它是有效的。其思想是,使用这个唯一的数据库生成的ID,我可以根据请求参数中包含正确格式的Pet
对象的PUT调用传入的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;
}
@CrossOrigin()
@RequestMapping(value=“/equalitytest”,method=RequestMethod.PUT,products=MediaType.APPLICATION\u JSON\u value)
public@ResponseBody Pet getEquality(@RequestBody Pet inputPet){
Pet res=null;
List pets=petRepo.findAll();
用于(宠物p:宠物){
如果(输入等于(p)){
res=p;
}
}
返回res;
}
这是错误的还是低效的方法?我曾读到,每当覆盖equals
时,覆盖hashCode
始终是最佳实践,但我不知道在这种情况下是否需要这样做/应该如何实现它
多谢各位 我认为这不是错误的或无效的方法 下面是一个供您参考的模型:
@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 + " ]";
}
在我的例子中,模型被称为组件
附2:……但是,为什么你想知道你的模型是否存在?Spring Boot中的存储库关注此方法的详细信息
我希望能帮助你 我认为这不是错误的或无效的方法 下面是一个供您参考的模型:
@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 + " ]";
}
在我的例子中,模型被称为组件
附2:……但是,为什么你想知道你的模型是否存在?Spring Boot中的存储库关注此方法的详细信息
我希望能帮助你 如果使用生成的ID(即您的情况),依赖数据库标识符比较(
petId
)可能会给您带来麻烦。想想看;在保存对象之前,不会设置标识符值。只有在瞬态对象上调用了session.save()
使其持久化时,才会设置它
如果您使用手动分配的ID,我们可以说您没有问题,您只需确保在将对象添加到集合之前设置标识符值
此外,您必须考虑您试图为该特定实体/对象实现什么。可能还有其他字段(通常是这种情况)可供您查看该对象是否不同
例如,假设您的equals
和hashCode
契约基于实体ID,并且您正在建模一个个人{ID,first\u name,last\u name,ssn}
对象。如果我为两个记录提供相同的名字
、姓氏
和ssn
,它们不是真的相等吗?但是因为您只考虑实体ID,所以不会考虑
关于覆盖
equals
和hashCode
,Hibernate(但很长)描述如何执行以及何时执行。如果使用生成的ID(即您的情况),依赖数据库标识符比较(petId
)可能会给您带来麻烦。想想看;在保存对象之前,不会设置标识符值。只有在瞬态对象上调用了session.save()
使其持久化时,才会设置它
如果您使用手动分配的ID,我们可以说您没有问题,您只需确保在将对象添加到集合之前设置标识符值
此外,您必须考虑您试图为该特定实体/对象实现什么。可能还有其他字段(通常是这种情况)可供您查看该对象是否不同
例如,假设您的equals
和hashCode
契约基于实体ID,并且您正在建模一个个人{ID,first\u name,last\u name,ssn}
对象。如果我为两个记录提供相同的名字
、姓氏
和ssn
,它们不是真的相等吗?但是因为您只考虑实体ID,所以不会考虑
关于覆盖
equals
和hashCode
,Hibernate(但很长)描述如何执行以及何时执行。始终覆盖equals
,hashCode
,toString
,如果使用,将进行比较并保持一致。我建议遵循良好的面向对象实践,使用自然键实现相等。远离对象模型中的人工“id”字段。当它们本身可以更新时,如何使用自然关键点?例如,Pet
类中还有两个字段,分别称为petName
和petOwner
,可以根据与另一个对象的petId
字段确定的相等性来更新这两个字段中的任何一个。始终覆盖等于,hashCode
,toString
,如果使用,比较
并保持一致。我建议遵循良好的面向对象实践,使用自然键实现相等。远离对象模型中的人工“id”字段。当它们本身可以更新时,如何使用自然关键点?例如,Pet
类中还有两个字段,分别称为petName
和petOwner
,可以根据与另一个对象的petId
字段确定的相等性来更新这两个字段。不幸的是,hashCode不起作用,因为它在我的实体中的类型为long
。感谢.save
,它完全符合我的要求。我通过了测试