2012-06-06 6 views
3

봄, JPA와 최대 절전 모드를 사용하고 있습니다. JPA 엔티티 관계 : 삭제 캐스케이드

내가 가지고 다음 엔터티 :
@Entity 
@Table(name = "Product") 
public class Product { 

    @Id 
    private Integer productId; 

    @ManyToOne(cascade = CascadeType.ALL) 
    @OnDelete(action = OnDeleteAction.CASCADE) 
    @JoinColumn(name = "Supplier_ID") 
    private Supplier supplier; 

    ... 
} 

이제

@Entity 
@Table(name = "Supplier") 
public class Supplier { 

    @Id 
    @Column(name = "Supplier_ID", nullable = false) 
    private Integer supplierId; 

    ... 
} 

하고, 내 질문에 주어진 스키마입니다

  1. 내가 아이에서 행을 삭제

    (즉, 제품), 공급자도 삭제됩니까?
  2. 은 또는, 부모 (예. 공급자는) 다음로 삭제가 모든 자식 '제품'

감사를 삭제 계단식 경우에만입니다.

답변

5

OnDelete 주석으로 인해 공급 업체가 제거되면 제품이 제거됩니다.

OnDelete 어노테이션은 스키마가 최대 절전 모드에 의해 생성 된 경우에만 사용됩니다. 참조 된 행이 h 제될 때 외부 키를 포함하는 행이 h 제되도록 데이터베이스에 외부 키를 구성합니다.

http://docs.jboss.org/hibernate/annotations/3.5/reference/en/html_single/#entity-hibspec-singleassoc를 참조하지만 Hibernate는 또한 때문에 협회에서 설정 한 CascadeType.ALL의, (당신이 원하는 아마되지 않습니다) 제품을 삭제 공급 업체에 삭제합니다. 이 속성을 제거해야합니다. 제품을 제거 할 때 공급자를 삭제할 이유가 없습니다.

+0

감사합니다. 그렇다면 CasacadeType.ALL 대신 무엇을 사용해야합니까? 나는 공급자가 삭제 될 때 제품을 삭제하고 싶다, 다른 방법으로 삭제하지 말라 ?? – JazB

+0

먼저, 당신은 계단식으로 누가 삭제해야하는지 * Hibernate 또는 데이터베이스를 결정해야한다. 데이터베이스 인 경우 @OnDelete (action = Cascade)가 솔루션입니다. Hibernate 인 경우 cascade = REMOVE 또는 cascade = ALL을 연결의 다른 쪽 * (즉, @OneToMany 주석의 Supplier 엔티티)에 넣어야합니다. 이 연관성을 양방향으로 만들고 싶지 않다면, 공급 업체의 모든 제품을 찾아서 삭제 한 다음 공급 업체를 삭제하여 직접 캐스케이드를 적용해야합니다. –

+0

확인. @OnDelete (action = OnDeleteAction.CASCADE) 만 제거하면 어떻게됩니까? 공급자가 삭제되면 produst가 삭제됩니까 ?? – JazB