Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 需要什么来确定@Entity类的相等性?_Java_Spring Boot_Spring Data Jpa - Fatal编程技术网

Java 需要什么来确定@Entity类的相等性?

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

我正在进行Springboot开发,想知道是否可以安全地只覆盖
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
,它完全符合我的要求。我通过了测试