2013-11-03 2 views
3

다 대 다 관계가있는 엔티티가 2 개 있습니다. Movie Entity는이 관계의 소유자이므로, Actor Entity를 삭제할 때 @PreRemove 주석이 달린 메소드를 사용하여 "Foreign key violation exception"을 피하기 위해 Movie Cast에있는 Actor ID의 모든 항목을 삭제합니다. 영화 객체가 제대로 데이터베이스에 업데이트됩니다 -JPA - @PreRemove 메서드 동작

영화 클래스

@Entity 
public class Movie extends AbstractBusinessObject{ 

    @ManyToMany 
    private Map<String, Actor> cast; 

    // setters and getters 

    public void removeCastMember(Actor actor){ 

     for (Entry<String, Actor> e : cast.entrySet()) { 
      if(e.getValue().id.equals(actor.id)){ 
       cast.remove(e.getKey()); 
      } 
     } 

    } // removeCastMember() 

} 

Actor 클래스

@Entity 
public class Actor extends AbstractBusinessObject{ 

    @ManyToMany(mappedBy = "cast") 
    private Set<Movie> movies; 

    // setters and getters 

    @PreRemove 
    private void removeActorFromMovies() { 
     for (Movie m : movies) { 
      m.removeCastMember(this); 
     } 
    } 

} 

내 테스트, 작동 에서 명확하게합니다. 그러나 saveOrUpdate() 호출이 없거나 해당 개체를 유지/병합 할 때 어떻게 가능할 수 있는지 이해할 수 없습니다.

답변

8

JPA/Hibernate의 기본 기능입니다. 첨부 된 엔티티들에 대한 모든 변경은 자동적으로 영속화된다 : Hibernate는 그것들을 관리하여 현재 상태를 초기 상태와 비교하고 모든 변경 사항을 자동으로 유지한다.

많은 엔티티를 수정하는 복잡한 비즈니스 메소드에서 수정 된 모든 엔티티를 추적 할 필요가 없으므로 이는 매우 유용합니다. 또한 Hibernate가 불필요한 SQL을 실행하지 않기 때문에 효율적이다. 엔티티가 트랜잭션 중에 변경되지 않았다면이 엔티티에 대해 SQL 업데이트 쿼리가 실행되지 않는다. 엔티티를 수정하고 트랜잭션을 롤백하는 예외를 던지면 Hibernate는 업데이트를 건너 뛸 것이다.

그래서, 일반적인 JPA 코드는 다음과 같습니다

void transfer(Long fromAccountId, Long toAccountId, BigDecimal amount) { 
    Account from = em.find(Account.class, fromAccountId); // from is managed by JPA 
    Account to = em.find(Account.class, ftoAccountId); // to is managed by JPA 
    from.remove(amount); 
    to.add(amount); 

    // now the transaction ends, Hibernate sees that the state of from and to 
    // has changed, and it saves the entities automatically before the commit 
} 

persist()는 Hibernate에 의해 관리하기 위해 새로운 기업이 지속하기 위해, 즉 사용됩니다.

merge()은 분리 된 엔티티 (즉, Hibernate에 의해 관리되지 않지만 이미 ID와 상태를 가지고있는 엔티티)를 취하여 동일한 ID를 갖는 첨부 된 엔티티로 상태를 복사하는 데 사용됩니다.

+0

그런 철저한 대답에 감사드립니다. 중요한 부분을 잊어 버렸습니다. '병합은 분리 된 개체를 사용하는 것입니다.' –