我有一个连接到 MySQL 数据库的 JPA 项目,其中我的实体对象映射到具有 2 列约束的表。那是:
@Entity
@Table(name = "my_entity")
class MyEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Basic(optional = false)
@Column(name = "id")
private Integer id;
@Basic(optional = false)
@Column(name = "myField1")
private String myField1;
@Basic(optional = false)
@Column(name = "myField2")
private int myField2;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "myEntity")
private Set<OtherEntity> otherEntitySet;
}
在数据库中,my_entity 表对 (myField1, myField2) 具有唯一约束。问题是,如果我使用 EntityManager.remove(entity) 删除现有实体,然后使用 EntityManager.persist(entity) 添加新实体,则数据库会引发有关重复行的错误。
例如:
entityManager.getTransaction().begin();
MyEntity entity1 = new MyEntity();
entity1.setMyField1("Foo");
entity1.setMyField2(500);
entityManager.persist(entity1);
entityManager.getTransaction().commit();
entityManager.getTransaction().begin();
entityManager.remove(entity1);
MyEntity entity2 = new MyEntity();
entity2.setMyField1("Foo");
entity2.setMyField2(500);
entityManager.persist(entity2);
entityManager.getTransaction().commit();
这给了我一个 MySQLIntegrityConstraintViolationException 抱怨这是一个重复的条目。我想这是因为它试图在删除旧条目之前添加新条目。有什么办法可以维持这种秩序吗?或者,有没有办法使用 JPA 来防止这种情况?这不是一个常见的用例,但我担心一个用户试图删除一个实体以摆脱所有相关数据并重新开始,然后重新创建更简单的字段,然后发现数据从未被删除。
hashCode 和 equals 的实现如下:
public int hashCode() {
int hash = 0;
hash += (getMyField1().hashCode() + getMyField2());
return hash;
}
public boolean equals(Object object) {
if (!(object instanceof MyEntity)) {
return false;
}
MyEntity other = (MyEntity) other;
return (getMyField2() == other.getMyField2()) &&
(getMyField1().equals(other.getMyField1()));
}