2012-03-10 1 views
2

나는 다음 (간체) 문제가있어 : 나는의 실체가Hibernate는 entityManager.remove()를 호출 할 때 참조 된 엔티티를 제거합니까?

을 대일 관계 : 한 - 투에서

@Entity 
public class Membership { 

    private User user; 

    @ManyToOne(cascade = CascadeType.ALL) 
    public User getUser() { 
     return user; 
    } 

    public void setUser(User user) { 
     this.user = user; 
    } 

} 

... 다음과 같은 해당 클래스 - 많은 측면 :

@Entity 
public class User extends Person { 
    private Set<Membership> memberships = new HashSet<Membership>(); 

    @OneToMany(mappedBy = "user", cascade = { CascadeType.MERGE, 
      CascadeType.REMOVE, CascadeType.REFRESH }) 
    public Set<Membership> getMemberships() { 
     return memberships; 
    } 

    public void setMemberships(Set<Membership> memberships) { 
     this.memberships = memberships; 
    } 
} 

나는이처럼 그들을 new를 통해 user1라는 사용자와 회원 mem1를 만들고 연결 한 :

mem1.setUser(user1); 
user1.getMemberships().add(mem1); 

는이 같은를 지속하고 있습니다 :

entityManager.getTransaction().begin(); 
entityManager.persist(user1); 
entityManager.persist(mem1); 
entityManager.getTransaction().commit(); 

가 지금은 회원 자격을 삭제할. 그래서 전화 :

entityManager.remove(mem1); 

... 나는 Membership 측면에 User 측면에 cascade=CascadeType.REMOVEcascade=CascadeType.ALL을 설정 한 리콜을. 그러나 참조 된 회원 mem1user1에서 자동으로 제거되지 않습니다. 즉 user1.getMemberships()은 여전히 ​​mem1입니다. 이것이 올바른 행동입니까? JPA는 엔티티를 데이터베이스에서 제거 할 때 객체에서 참조를 자동으로 제거하지 않습니다.

이것은 어리석은 질문처럼 보일 수 있지만 JPA의 초보자이며 특수 효과가 어떤 종류의 마법을하는지 정확히 알기가 어렵습니다. 때로는 상당히 큽니다.

답변

3

제거를 계단식으로 사용하면 참조 된 엔터티 (또는 엔터티 컬렉션)에 대해 최대 절전 모드 호출 entityManager.remove()이 호출됩니다. 따라서 참조 된 엔티티는 데이터베이스에서 제거됩니다. 그러나 엔티티 인스턴스는 변경되지 않습니다.

ManyToOne에서 캐스케이드 = 제거 또는 모두를 사용하는 것은 대개 매우 나쁜 생각입니다. 일반적으로 회원 중 하나만 삭제할 때 사용자를 삭제하고 싶지는 않습니다.

2

글쎄, 그렇습니다.이 경우에는 큰 효과가 없습니다. 으로 인해 관련 기관은 당신이 당신이 할 수있는 삭제 있는지 확인하기 위해, 분리 여부 될 수 있다는 사실에 두 가지 중 하나를

  • 당신이 JPA2를 사용하는 경우, orphanRemove 옵션 추가 :

    @OneToMany (mappedBy = "whatever", orphanRemoval = true)

  • JPA1을 사용하는 경우 수동으로 제거해야합니다.

관련 문제