【发布时间】:2018-07-15 02:11:51
【问题描述】:
我在下面的简单员工实体中实现哈希码/等于时遇到问题。我想要实现相等的自定义字段是“_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() 是否有导致此问题的原因,或者我对如何执行相等/哈希码合同的理解不正确?
我以为我理解相等/哈希码,但看起来并非如此。任何帮助表示赞赏。谢谢。
【问题讨论】:
-
这与 Spring Data JPA 无关,而仅与 JPA 的工作方式有关。如果您不想保存它,请在数据库级别创建唯一约束。
标签: java spring spring-mvc jpa spring-data