2013-07-25 2 views
2

나는 onetoone 관계와 두 기관이, A와 B B 엔티티, 업데이트 및 그것의 자신을 제거 할 수있는 선택 사항이지만 항상 연결되어 있어야합니다 제거는 엔티티를 삭제하는 JPA 방법 캐스케이드 onetoone의 대상

A.

인스턴스에 따라서 난 양방향 관계 JPA 개의 엔티티 A 및 B가있다. 이것은 내가 A A를 생성 할 수 있습니다와 B는 A를 제거 B.

@OneToOne(mappedBy = "a", fetch = FetchType.LAZY, cascade = CascadeType.ALL) 

에 대한의 하나이며 모두 삭제하세요. 좋은.

그러나 때문에 내가 삭제를 em.remove(b) 경우, A에서 B로 캐스케이드의

은 지속되지 않습니다. 비록 내가 먼저 a.setB(null)을 할지라도.

캐스케이드를 유지하면서, 옵션 개체를 삭제하는 유일한 방법은 새로운 JPA2 기능, 진정한 orphanRemoval =를 사용하는 것 같다. 이것은 내가 직접 B에 대한 작업을 수행 할 수 없음을 의미 A. 다음 지속,

a.setB(null)에 전화를 걸어이 조성 관계의 너무 강한 의미, B의 모든 행동은

A. 통해 수행해야하지만 B는 아니다 임베디드 객체, 그것은 완전히 날아간 엔터티 자신의 권리, 어떻게 그것을 독립적으로 삭제할 수 있습니까?

가장 좋은 방법은 폭포를 제거하는 것, 힘의 사용자는이 (가)를 삭제하기 전에 별도로 모든 관련 개체를 삭제 확인? B 테이블의 FK 제약 조건에 의해 시행됩니다.

는 정직 경우입니다. 두 개의 관련 엔티티, 관계는 한 쪽에서 선택 사항이며 다른 쪽에서는 필수 항목입니다.

아, 이것은 최대 절전 모드 4.2.3-최종 현재 개체의 디자인을 암시 적으로 하나가 다른 것보다 더 중요하다고 정의

+0

'em.remove (B)'에 관계없이 A에 가지고있는 캐스케이드의 작업을해야 당신이 시도하셨습니까 트랜잭션을 열고, B의 인스턴스를 찾고, 거기에서 remove를 호출하고, 트랜잭션을 커밋하는 간단한 예제? 호기심에서 벗어나 A를 삭제하기 전에 B의 참조를 null로 설정합니까? 나는 당신이해야한다고 생각하지 않지만 그것이 효과를 낼 수 있습니다. – Pace

+0

안녕하세요, 네, 그걸 시도했습니다. 방금 B에 대한 참조를 A에 null로 설정하려고 시도했지만 변경하지 않았습니다. 그러나 그냥 내 삭제 후 내 찾기 전에 EntityManager에서 플러시 호출을 시도했다. 이제 삭제 된 것으로 보입니다. 그래서 최대 절전 캐싱 버그처럼 보이나요? –

+0

FlushMode.AUTO가 아닌 다른 것으로 플러시 모드를 변경 했습니까? 그렇다면, 그것은 캐싱 버그가 아니며, 그것은 Hibernate가 작동하도록 설계된 방법이다. – Pace

답변

1

함께. 즉, 다른 사람에게 외래 키를 갖게됩니다.

동등한으로 만들려면 JoinTable을 정의하십시오. 양쪽에 캐스케이드를 설정하면 모든 것이 예상대로 작동합니다.

예 :

문서 클래스

@Entity 
public class Document extends ABaseEntity { 

private Medicine medicine; 

@OneToOne(cascade = CascadeType.REMOVE) 
@JoinTable(
     name = "Document_Medicine", 
     joinColumns = 
     @JoinColumn(name = "DOC_ID", referencedColumnName = "ID"), 
     inverseJoinColumns = 
     @JoinColumn(name = "MED_ID", referencedColumnName = "ID")) 
public Medicine getMedicine() { 
    return medicine; 
} 

public void setMedicine(Medicine medicine) { 
    this.medicine = medicine; 
} 
} 

의학 클래스

@Entity 
public class Medicine extends ABaseEntity{ 
private Document document; 

@OneToOne(mappedBy = "medicine", cascade = CascadeType.REMOVE) 
public Document getDocument() { 
    return document; 
} 

public void setDocument(Document document) { 
    this.document = document; 
} 
}