java - Spring Data JPA save() 方法不遵循 hashcode/equals 约定

标签 java spring spring-mvc jpa spring-data

我在下面的简单员工实体中实现 hashcode/equals 时遇到问题。我想要实现相等性的自定义字段是“_id”字段。

当我保存两个具有相同值(即“111”)的员工对象时,我希望在数据库中仅保存一个值。不过,我最终保存了 2 条员工记录。

实体代码如下

    @Entity
    @Table(name = "employee")
    public class Employee {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "employee_id")
    private Long employeeId;

    @Column(name = "employeehexa_id") 
    private String _id;

    @Override
    public int hashCode() {
        HashCodeBuilder hcb = new HashCodeBuilder();
        hcb.append(_id);
        return hcb.toHashCode();
    }   


    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (!(obj instanceof Employee)) {
            return false;
        }
        Employee that = (Employee) obj;
        EqualsBuilder eb = new EqualsBuilder();
        eb.append(_id, that._id);
        return eb.isEquals();
    }

    // Required Constructors, getters, setters not shown for brevity
   }

下面是我调用保存两个具有相同 _id 的对象

@Autowired
private EmployeeRepo employeeRepo;

@RequestMapping("/test")
String Test() throws Exception {

    Employee e1 = new Employee("111");
    Employee e2 = new Employee("111");
     System.out.println(e1.equals(e2)); // prints true, implying hashcode and equals working fine
    employeeRepo.save(e1);
    employeeRepo.save(e2);//Both e1 and e2 are saved inspite of being equal

    return "Completed !";
}

平等检查似乎工作正常。 spring JpaRepository 的 save() 是否存在导致此问题的原因,或者我对平等/哈希码契约如何执行的理解不正确?

我以为我理解相等/哈希码,但看起来情况并非如此。任何帮助表示赞赏。谢谢。

最佳答案

根据这个答案,https://stackoverflow.com/a/11881628/5695673 ,您可能有 2 条记录,因为您的实体的字段 employeeId 不同,因此对于 spring-data,这两个实体是不同的。
要测试您的 equals()/hashCode() 是否按预期工作,您可以尝试将实体放入检查对象相等性的集合中(即 Set)并尝试一次性保存所有设置。

示例:

Set<Employee> employees = new HashSet<Employee>();
employees.add( new Employee("111"));
employees.add( new Employee("111"));

System.out.println(employees.size()); //1
employeeRepo.save(employees); // 1 record

更多信息请点击:https://developer.jboss.org/wiki/EqualsandHashCode?_sscc=t

关于java - Spring Data JPA save() 方法不遵循 hashcode/equals 约定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48618883/

相关文章:

spring - 我应该使用最新版本的 Spring

java - 如何从 JCAPS 迁移到 WSO2 ESB

java - jpa实体映射情侣表

java - 有没有更短的方法来替换字符串中的某些字符而不是连续调用 String.replace?

java - 与 REST Web 服务设计相比,使用 Direct Web Remoting 有何优势?

javascript - 如何将网页中的字符串输入作为 Java 对象传递给 @RestController?

java - 如何在我的 tomcat 应用程序中实现特定于环境的 init 参数

spring - Gradle Spring Boot 依赖项未找到多模块项目

java - Java Hashmap<Integer, Integer> 和 mysql 临时表哪个更有效?

java - Spring/JPA 多线程死锁