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

时间:2017-03-10 00:56:57

标签: java spring-boot spring-data-jpa

我正在做一些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始终是最佳做法,但我不知道在这种情况下是否需要它/如何实现它。

谢谢。

2 个答案:

答案 0 :(得分:2)

如果您使用生成的ID(这是您的情况),依赖于数据库标识符比较(在您的情况下为petId)可能会让您遇到麻烦。想一想;在保存对象之前,不会设置标识符值。只有在瞬态对象上调用session.save()时才会设置它,使其持久化。

如果您使用手动分配的ID,我们可以说您没有遇到麻烦,您只需确保在将对象添加到集合之前设置标识符值。

此外,您必须考虑您要为该特定实体/对象实现的目标。可能还有其他字段(通常就是这种情况),您可以依赖它来查看该对象是否可以不同。

例如,假设您将equalshashCode合同基于实体ID,并且您正在为Person {id, first_name, last_name, ssn}对象建模。如果我为两条记录提供相同的first_namelast_namessn,那么它们是否相等?但是因为你只考虑实体ID,所以不会。

关于覆盖equalshashCode,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)

上的详细信息

我希望能帮到你!