문제

나는 Hibernate의 반대 속성을 이해하려고 노력해 왔으며 그것은 개념적으로 어려운 것 중 하나일 뿐인 것 같습니다.

내가 얻은 요점은 상위 엔터티(예:Parent)를 사용하는 Child 객체 컬렉션이 있는 일대다 매핑에서 inverse=true로 설정하면 Hibernate에게 '다른 쪽(자식)이 자신의 테이블에 외래 키 참조를 유지하기 위해 자신을 업데이트할 책임이 있다'고 알려줍니다.

이렇게 하면 코드의 컬렉션에 Children을 추가한 다음 Parent(모두 계단식 설정 사용)를 저장할 때 두 가지 이점이 있는 것으로 보입니다. 데이터베이스에 불필요한 히트를 저장했습니다. (왜냐하면 역 세트가 없으면 Hibernate는 FK 관계를 업데이트할 수 있는 두 곳이 있다고 생각하기 때문입니다) 그리고 공식 문서에 따르면:

협회의 열이 null로 선언되면 nhibernate는 협회를 생성하거나 업데이트 할 때 제약 위반을 유발할 수 있습니다.이 문제를 방지하려면 ververse = "true"로 표시된 많은 가치가있는 끝 (세트 또는 백)과 양방향 연관성을 사용해야합니다.

지금까지는 이 모든 것이 이해가 되는 것 같습니다.내가 얻지 못하는 것은 이것입니다 :언제 할래? 아니다 일대다 관계에서 inverse=true를 사용하고 싶나요?

도움이 되었습니까?

해결책

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>

스파이마스터는 스파이를 가질 수 있지만 스파이 클래스에 다대일 관계를 포함하지 않았기 때문에 스파이는 자신의 스파이마스터가 누구인지 결코 알 수 없습니다.또한 (편리하게) 스파이는 불량배로 변할 수 있으므로 스파이마스터와 연결될 필요가 없습니다.다음과 같이 엔터티를 만들 수 있습니다.

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 테이블과 Spy 테이블에 삽입되고 그 후에만 Spy 테이블을 업데이트하여 FK를 설정하므로 FK 열을 Null 허용으로 설정합니다.이 경우 inverse = true로 설정하면 FK가 업데이트되지 않습니다.

다른 팁

많은 표를 얻은 답변에도 불구하고 이에 대한 또 다른 답변이 있습니다.

다음 관계가 있는 클래스 다이어그램을 고려해보세요.

Parent => list of Items
Item => Parent

아무도 항상 즉, Item => Parent 관계는 Parent => Items 관계와 중복됩니다.항목은 모든 상위 항목을 참조할 수 있습니다.

하지만 귀하의 지원서에는 당신은 관계가 중복된다는 것을 알고 있습니다.관계를 데이터베이스에 별도로 저장할 필요가 없다는 것을 알고 있습니다.그래서 당신은 그것을 저장하기로 결정했습니다. 단일 외래 키, 항목에서 상위 항목을 가리킵니다.이 최소한의 정보만으로도 목록을 구성하기에 충분합니다. 그리고 다시 참조.

이를 NH로 매핑하기 위해 해야 할 일은 다음과 같습니다.

  • 두 관계에 동일한 외래 키를 사용합니다.
  • 하나(목록)가 다른 하나와 중복되므로 객체를 저장할 때 무시될 수 있다고 NH에 알립니다.(NH가 실제로 하는 일이 바로 이것이다. inverse="true")

이것은 역과 관련된 생각입니다.다른 것은 없습니다.선택 사항이 아니며 올바른 매핑 방법은 한 가지뿐입니다.


스파이 문제:전혀 다른 논의입니다 만약에 항목에서 상위 항목으로의 참조를 지원하려고 합니다.이는 귀하의 비즈니스 모델에 달려 있으며 NH는 이에 대해 어떠한 결정도 내리지 않습니다.관계 중 하나가 없으면 중복도 없고 역함수도 사용되지 않습니다.

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

아이들이 부모에게 탐색 할 수없는 단방향 연관성을 원한다면. 그렇다면, 자녀가 부모 앞에 저장되기 때문에 FK 열은 무효가되어야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top