我有一个JPA项目连接到一个MySQL数据库,其中我的实体对象映射到一个约束2列的表。即:坚持一个新的但相同的实体与JPA报告重复条目
@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和等于实现如下:
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()));
}
您可以加入您的equals和hashCode实现? – 2009-12-19 08:55:34
加入 - 我最初有一个等于检查Id的快捷方式,但我删除它来确认。同样的问题。 – Jon 2009-12-19 15:17:40