2009-06-30 4 views
69

나는 Hibernate의 inverse 속성을 이해하려고 노력해 왔으며, 개념적으로 어려운 것들 중 하나 일 뿐인 것처럼 보인다.언제 NHibernate/Hibernate OneToMany 관계에 대해 inverse = false를 사용합니까?

내가 얻는 요지는 일대 다 매핑을 사용하는 Child 객체의 콜렉션을 가진 부모 엔티티 (예 : 부모)가있을 때 매핑에서 inverse = true를 설정하면 Hibernate가 ' 상대방 (자식)은 테이블에 외래 키 참조를 유지하기 위해 자신을 업데이트해야합니다. '

코드에서 Children을 콜렉션에 추가 한 다음 부모 (모두 캐스케이드 세트로)를 저장하면 다음과 같은 이점이있는 것 같습니다. you save an unneccessary hit on the database (역 집합이 없으므로 Hibernate는 두 위치)이 FK 관계를 업데이트하고, 공식 문서에 따라하기 : 그것은 을 만들거나 연결을 업데이트 할 때

을 협회의 열이 NULL NOT 를 선언하는 경우, NHibernate에는 제약 조건 위반이 발생할 수 있습니다. 이 문제를 방지하려면 많은 값 끝 (집합 또는 가방) 과 inverse = "true"로 표시된 양방향 연결을 사용해야합니다.

이 모든 것이 지금까지 의미가있는 것처럼 보입니다. 내가 얻지 못하는 것은 이것입니다 : NOT 일대 다 관계에서 inverse = true를 사용하고 싶습니까?

답변

81

Matthieu가 말했듯이, inverse = true로 설정하지 않으려는 유일한 경우는 자식이 지식이없는 경우와 같이 자체를 업데이트해야하는 경우에 해당하지 않는 경우입니다 부모의

<class name="SpyMaster" table="SpyMaster" lazy="true"> 
    <id name="Id"> 
    <generator class="identity"/> 
    </id> 
    <property name="Name"/> 
    <set name="Spies" table="Spy" cascade="save-update"> 
    <key column="SpyMasterId"/> 
    <one-to-many class="Spy"/> 
    </set> 
</class> 

<class name="Spy" table="Spy" lazy="true"> 
    <id name="Id"> 
    <generator class="identity"/> 
    </id> 
    <property name="Name"/> 
</class> 

Spymasters가 스파이를 가질 수 있지만, 우리가 대일 관계를 포함하지 않았기 때문에 스파이가 자신의 spymaster이 누구인지 결코 :

은 모든 인위적인 예를 현실 세계를 시도, 그리고 수 있습니다 스파이 수업에서. 또한 (편리하게) 스파이가 불량배가 될 수 있으므로 스파이 마스터와 연관 될 필요가 없습니다. 다음과 같이 우리는 개체를 만들 수 있습니다

var sm = new SpyMaster 
{ 
    Name = "Head of Operation Treadstone" 
}; 
sm.Spies.Add(new Spy 
{ 
    Name = "Bourne", 
    //SpyMaster = sm // Can't do this 
}); 
session.Save(sm); 

당신이 SM을 저장하는 행위가 SpyMaster 테이블과 스파이 테이블에 삽입 한 것이기 때문에 널 (NULL)이 될하기 위해 FK 열을 설정합니다 이러한 경우에는 후에 만 ​​그게 것 그런 다음 스파이 테이블을 업데이트하여 FK를 설정하십시오. 이 경우 inverse = true로 설정하면 FK가 업데이트되지 않습니다.

+0

이것은 나를 위해 작동하지 않았다. 업데이트를 실행하지 않습니다. 단지 삽입 만합니다. – BradLaney

14

단방향으로 연결하려는 경우, 즉 자녀가 부모로 이동할 수없는 경우. 그렇다면 자녀가 부모 앞에 저장되기 때문에 FK 열은 NULLABLE이어야합니다.

28

높은 득표 수락 답변에도 불구하고 이에 대한 또 다른 답변이 있습니다. 항목은 => 부모 관계는 부모 => 항목 관계에 대한 여분의 것을, 이제까지 말했다

 
Parent => list of Items 
Item => Parent 

아무도 :

는 이러한 관계가있는 클래스 다이어그램을 고려하십시오. 아이템은 모든 부모를 참조 할 수 있습니다.

그러나 응용 프로그램에서 은 중복이임을 알고 있습니다. 관계가 데이터베이스에 별도로 저장 될 필요가 없다는 것을 알고 있습니다. 따라서 단일 외래 키에 항목을 부모를 가리 키도록 저장하기로 결정했습니다. 이 최소한의 정보는 목록을 작성하기에 충분합니다.

은 NH와 함께이를 매핑 할 필요

은 다음과 같습니다

  • 한 (목록)가 다른 중복 무시 될 수 있다는
  • 는 NH 말해 둘의 관계에 대해 같은 외래 키를 사용하여 개체를 저장할 때. (그것은 NH가 실제로 inverse="true"을 사용하여 수행하는 것입니다.)

이것은 inverse와 관련된 생각입니다. 다른 건 없어. 그것은 선택이 아니며 올바른 매핑의 한 가지 방법이 있습니다. 스파이 문제


: 그것은 당신이 부모에 대한 항목에서 참조를 지원하려는 경우 완전히 다른 논의 입니다. 이것은 귀하의 비즈니스 모델에 달려 있으며, 뉴 햄프셔는 이에 대한 결정을하지 않습니다. 관계 중 하나가 누락 된 경우 중복이 없으며 역변환을 사용하지 않습니다.

잘못 사용 : 메모리에 중복성이없는 목록에 inverse = "true"를 사용하면 단지 저장되지 않습니다. inverse = "true"를 지정하지 않으면 NH는 중복 정보를 두 번 저장할 수 있습니다.

+0

그 대답은 받아 들인 대답보다 더 잘 이해할 수 있다는 것을 알게되었습니다. – r3try

+0

제 [대답] (http://stackoverflow.com/a/6951546/221708)보다 훨씬 더 간단하고 요점이 있습니다. –