NHibernate / Hibernate OneToMany 관계에서 inverse = false를 언제 사용합니까?
나는 Hibernate의 역 속성을 이해하려고 노력해 왔으며 개념적으로 어려운 것들 중 하나에 불과한 것 같습니다.
내가 얻은 요점은 일대 다 매핑 을 사용하는 자식 개체 컬렉션이있는 부모 엔터티 (예 : 부모)가있을 때 매핑에서 inverse = true를 설정하면 Hibernate에게 '다른 쪽 (자식 )는 테이블에서 외래 키 참조를 유지하기 위해 자체적으로 업데이트 할 책임이 있습니다.
이렇게하면 코드의 컬렉션에 Children을 추가 한 다음 부모를 저장할 때 두 가지 이점이있는 것으로 보입니다 (모든 집합 을 사용하여 ) : 데이터베이스에 불필요한 히트를 저장합니다 (역 집합이 없으면 Hibernate가 생각하기 때문입니다). FK 관계를 업데이트하는 두 곳이 있습니다), 공식 문서에 따르면 :
연관 열이 NOT NULL로 선언되면 NHibernate는 연관을 생성하거나 업데이트 할 때 제약 조건 위반을 일으킬 수 있습니다. 이 문제를 방지하려면 inverse = "true"로 표시된 여러 값 끝 (세트 또는 백)과 양방향 연관을 사용해야합니다.
이 모든 것이 지금까지 이해가되는 것 같습니다. 내가하지 않는 것은이있다 : 당신이 할 때 NOT 사용 역에 원하는 = 진정한 일대 다 관계에?
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 열을 nullable로 설정합니다. 이 경우 inverse = true로 설정하면 FK가 업데이트되지 않습니다.
높은 투표로 받아 들여진 답변에도 불구하고 그것에 대한 또 다른 답변이 있습니다.
다음 관계가있는 클래스 다이어그램을 고려하십시오.
상위 => 항목 목록 항목 => 상위
아무도는 이제까지 항목 => 부모 관계는 부모 => 항목 관계에 대한 중복이라고, 말했다. 항목은 모든 상위를 참조 할 수 있습니다.
그러나 응용 프로그램 에서 관계가 중복된다는 것을 알고 있습니다. 관계가 데이터베이스에 별도로 저장 될 필요가 없다는 것을 알고 있습니다. 따라서 항목에서 상위를 가리키는 단일 외래 키 에 저장하기로 결정합니다 . 이 최소한의 정보는 목록 과 참조를 작성하기에 충분합니다 .
이를 NH와 매핑하기 위해해야 할 일은 다음과 같습니다.
- 두 관계 모두에 동일한 외래 키 사용
- NH에게 하나 (목록)가 다른 하나에 중복되고 객체를 저장할 때 무시 될 수 있음을 알려줍니다. (그것은 NH가 실제로하는 일입니다
inverse="true")
이것들은 역과 관련된 생각입니다. 다른 건 없습니다. 선택이 아니며 올바른 매핑 방법은 하나뿐입니다.
The Spy Problem: It is a completely different discussion if you want to support a reference from the Item to the Parent. This is up to your business model, NH doesn't take any decisions in this. If one of the relations is missing, there is of course no redundancy and no use of inverse.
Misuse: If you use inverse="true" on a list which doesn't have any redundancy in memory, it just doesn't get stored. If you don't specify the inverse="true" if it should be there, NH may store the redundant information twice.
If you want to have an unidirectional association i.e. that the children can't navigate to the Parent. If so, you FK column should be NULLABLE because the children will be saved before the parent.
'Nice programing' 카테고리의 다른 글
| 데이터 클래스는 무엇이며 공통 클래스와 어떻게 다릅니 까? (0) | 2020.11.01 |
|---|---|
| .net : System.Web.Mail 대 System.Net.Mail (0) | 2020.11.01 |
| JQuery, Spring MVC @RequestBody 및 JSON-함께 작동하도록 만들기 (0) | 2020.11.01 |
| gcount, tellg 및 seekg에서 g는 무엇을 의미합니까? (0) | 2020.11.01 |
| 프랙탈을 프로그래밍하는 방법? (0) | 2020.11.01 |