簡體   English   中英

Spring Data JPA save()方法未遵循哈希碼/等於合約

[英]Spring Data JPA save() method not following the hashcode/equals contract

我在下面的簡單員工實體中實現哈希碼/等於問題。 我要在其上實現相等性的自定義字段是“ _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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM