엔티티 객체가 2 개의 열에 제약 조건이있는 테이블에 매핑되는 MySQL 데이터베이스에 JPA 프로젝트가 연결되어 있습니다. 즉,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 (엔터티)가있는 기존 엔터티를 제거한 다음 EntityManager.persist (엔터티)를 사용하여 새 엔터티를 추가하면 데이터베이스에서 중복 행에 대한 오류가 발생한다는 것입니다. 예를 들어
:
이 나에게이 중복 된 항목 것에 대해 불평 MySQLIntegrityConstraintViolationException을 제공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();
. 이전 항목을 제거하기 전에 새 항목을 추가하려고하기 때문에 그것이라고 생각합니다. 그 명령을 유지할 방법이 있습니까? 또는 JPA를 사용하여 이러한 상황을 방지 할 수있는 방법이 있습니까? 정확히는 일반적인 유스 케이스는 아니지만 모든 관련 데이터를 제거하고 다시 시작하기 위해 엔티티를 삭제하려고 시도한 사용자가 걱정할 필요가 없다면 더 쉬운 필드를 다시 만든 다음 데이터가 제거되지 않았 음을 확인하십시오. 다음과 같이
의 해시 코드와 동일 구현은 다음과 같습니다
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()));
}
당신이 당신의 등호와 hashCode 구현을 추가 할 수 있습니다 :이 게시물 및 @EmbeddedId을 추가하는 방법에 대한 설명을 참조하십시오? –
추가됨 - 원래 ID 확인을 위해 equals에 지름길이 있었지만 확인을 위해 제거했습니다. 같은 문제. – Jon