[英]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.