2010-01-13 2 views
25

NHibernate의 모든 캐스케이드 설정에 대한 확실한 안내서가있는 인터넷 리소스가 있으며 여기에는 클래스 구조 예, HBM 및 모든 캐스케이드 설정에 대한 동작의 의미가 포함됩니다. NH와의 관계.NHibernate Definitive Cascade 응용 프로그램 가이드

상태를 삭제하지 않게 될 상태 테이블을 설정하는 것과 같은 가장 일반적인 방법으로 공통적 인 연결을 수행하는 예제가 있거나 도움이되는 개체를 삭제하는 것이 도움이됩니다. CreatedBy 사용자 속성은 캐스케이드 등에서 사용자를 삭제하지 않습니다.

답변

57

다음은 Java Hibernate 레퍼런스 http://docs.jboss.org/hibernate/stable/core/manual/en-US/html/objectstate.html#objectstate-transitive에서 Hiberate 3.0 (즉, 현재 svn 트렁크)에 적용되었습니다.

Persist(), Merge(), SaveOrUpdate(), Delete(), Lock(), Refresh(), Evict(), Replicate()를 포함하여 Hibernate Session의 각 기본 동작에 대해 캐스케이드 스타일. 개별적으로 계단식 스타일의 이름은 persist, merge, save-update, delete, lock, refresh, evict, replicate입니다. Save() 및 Update()의 캐스케이드 스타일은 save-update입니다. SaveAndUpdateCopy()의 경우 병합됩니다. PersistOnFlush()에서는 지속됩니다. 그리고 remove는 삭제를위한 별명입니다.

작업을 연결을 따라 계단식으로 나타내려면 매핑 문서에 작업을 나타내야합니다. 예를 들어 :

<one-to-one name="person" cascade="persist"/> 

케스 케이 딩 스타일들이 결합 될 :

<one-to-one name="person" cascade="persist,delete,lock"/> 

당신은 모든 작업이 연관에 따라 케스케이드되어야 함을 지정하는 캐스케이드 = "모든"을 사용할 수 있습니다. 기본 cascade = "none"은 연산이 계단식으로 연결되지 않도록 지정합니다.

특수한 계단식 스타일 인 delete-orphan은 일대 다 연관에만 적용되며 연관에서 제거 된 자식 개체에 Delete() 작업을 적용해야 함을 나타냅니다. 모든 삭제 - 고아는 모두 삭제, 고아와 동일합니다.

권장 사항 : 그것은 일반적으로에 캐스케이드 수 있도록 이해가되지 않습니다

  • < 대일 > 또는 < 대다 > 협회. 캐스케이드는 종종 < 일대일 > 및 < 일대 다 > 연관에 유용합니다.
  • 자식 개체의 수명이 부모 개체의 수명으로 제한되는 경우 cascade = "all-delete-orphan"을 지정하여 수명주기 개체로 만듭니다.
  • 그렇지 않으면 캐스케이드가 필요하지 않을 수도 있습니다. 그러나 동일한 거래에서 부모와 자녀들과 함께 자주 일할 것이라고 생각하고 타이핑을 자제하고 싶다면 cascade = "persist, merge, save-update"사용을 고려해보십시오.

는 (단일 값 연관이든 콜렉션 중 하나) 캐스케이드 매핑 = "모두"저장/업데이트에서 부모 결과의/삭제/업데이트 저장 부모/자식 스타일의 관계로 연결을 표시합니다/아이 또는 아이들의 삭제. 부모에 의해 참조 해제되지 않는 자식은 < 일대 다 많은 > 연관이 cascade = "delete-orphan"으로 매핑 된 경우를 제외하고는 자동으로 삭제되지 않습니다. 부모가 persist()에 전달된다

  • 경우, 모든 아이들이 부모가 병합 전달되면()
  • 을 지속하기 위해 전달되는 다음과 같이 부모/자식 관계에 대한 케스 케이 딩 오퍼레이션의 정확한 의미는
  • 부모가 Save(), Update() 또는 SaveOrUpdate()에 전달 된 경우 모든 자식이 SaveOrUpdate()에 전달됩니다.
  • 임시 또는 분리 된 자식이 영구 부모에 의해 참조되면 SaveOrUpdate()로 전달됩니다.
  • 부모가 삭제되면 모든 chi ldren은 Delete()로 전달됩니다.
  • 영속적 인 부모에 의해 참조 해제 된 경우, 특별한 경우는 없습니다 - 응용 프로그램이 cascade = "delete-orphan"이 아닌 한 응용 프로그램이 명시 적으로 자식을 삭제해야합니다.이 경우 "고아" 하위가 삭제됩니다.
+1

+1 및 현상금, 매우 유용한 답변. –

+2

안녕하세요! 귀하의 링크가 고장났습니다! –

3

이것은 명백한 조언 일 수 있지만 Ayende으로 만든 이전 게시물을 탐색하는 것이 좋습니다. NHibernate에 대한 빠른 search과 그의 사이트에서 캐스케이드 (cascade)는 몇 가지 흥미로운 게시물을 밝힙니다. 그러나 그들은 당신의 필요에 조금 부족할 수도 있습니다.

비록 인터넷 자원 그 자체가 아니지만, 나는 또한 NHibernate in Action을 추천 할 것입니다. 이 책은 제 3 장, 제 4 장, 그리고 제 6 장의 어느 정도 깊은 계단식 문제를 다루고 있습니다.이 책은 NHibernate 1.2를 대상으로합니다. 나는 NHibernate의 3.0 릴리스를 목표로하는 새로운 버전의 책이있을 것이라고 믿는다. 그것을 지켜 볼만한 가치가있을 것입니다.

나는 계단식 폭포에 대한 확실한 가이드를보고 싶었지만 나는 그것을 보지 못했습니다. 어쩌면 당신은 자신의 블로그에 자신의 게시물과 함께 폭포를 논의 거기 밖으로 블로그 게시물의 일부를 요약 할 수 있습니다.

+0

필자는 불행히도 이것이 사실이라고 믿기 시작했으나 NHibernate in Action에서 그 사실을 알고있는 것이 좋습니다. 나는 그렇게 많은 블로깅을하며 시간이별로 없다. –

+0

확실히 Nhibernate 3에 대한 공식 문서를 찾지 못했습니다. NHibernate에 대한 단점 중 하나가 업데이트 된 문서가 없기에는 너무 복잡합니다. –

3

내가 어떤 "확정"가이드를 모르겠지만, 내가 아는 최고의 자원이 NHibernate에있는 명확한 지도자 중 하나입니다 Ayende에서 블로그 게시물입니다 : 나를 위해

NHibernate Cascades: the different between all, all-delete-orphans and save-update

, 실제로는 cascade="none"cascade="all" 만 사용합니다. all-delete-orphan은 옵션입니다. 다른 모든 것은 의심 스럽습니다. 예를 들어, 인스턴스가 포함 된 객체보다 오래 지속되면 참조되므로 인스턴스를 암시 적으로 만들어야하는 이유는 무엇입니까? 나에게는 두 가지 상황 만 있습니다. 객체가 종속 객체이거나 독립 객체입니다.