Spring Data JPA save()方法不遵循hashcode / equals合约

时间:2018-02-05 09:03:34

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

我在下面的简单Employee Entity中遇到了实现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()导致这个或者我对如何强制执行相等/哈希码契约的理解?

我认为我理解了相等/哈希码,但看起来并非如此。任何帮助赞赏。 THX。

1 个答案:

答案 0 :(得分:2)

根据这个答案,this,您可能有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://stackoverflow.com/a/11881628/5695673