我有一個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