エンティティ オブジェクトが 2 つの列に制約のあるテーブルにマップされている MySQL データベースに接続された 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 と 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()));
}