소유 측의 개념이 필요한 이유는 무엇입니까?
양방향 관계의 소유 측면에 대한 아이디어는 관계형 데이터베이스에서 객체의 경우와 같이 양방향 관계가 없다는 사실에서 비롯됩니다. 데이터베이스에는 단방향 관계-외래 키 만 있습니다.
'소유자'라는 이름의 이유는 무엇입니까?
Hibernate에 의해 추적되는 관계의 소유 측은 데이터베이스에서 외래 키 를 소유 하는 관계의 측입니다 .
소유 측 개념이 해결하는 문제는 무엇입니까?
소유 측 을 선언 하지 않고 매핑 된 두 엔티티의 예를 보자 .
@Entity
@Table(name="PERSONS")
public class Person {
@OneToMany
private List<IdDocument> idDocuments;
}
@Entity
@Table(name="ID_DOCUMENTS")
public class IdDocument {
@ManyToOne
private Person person;
}
OO 관점에서이 매핑은 하나의 양방향 관계가 아니라 두 개의 개별적인 단방향 관계를 정의합니다.
매핑은 테이블 PERSONS
및 ID_DOCUMENTS
을 생성 할뿐만 아니라 세 번째 연관 테이블도 생성합니다 PERSONS_ID_DOCUMENTS
.
CREATE TABLE PERSONS_ID_DOCUMENTS
(
persons_id bigint NOT NULL,
id_documents_id bigint NOT NULL,
CONSTRAINT fk_persons FOREIGN KEY (persons_id) REFERENCES persons (id),
CONSTRAINT fk_docs FOREIGN KEY (id_documents_id) REFERENCES id_documents (id),
CONSTRAINT pk UNIQUE (id_documents_id)
)
기본 키주의 pk
에 ID_DOCUMENTS
만. 이 경우 Hibernate는 관계의 양면을 독립적으로 추적합니다. 관계에 문서를 추가 Person.idDocuments
하면 연관 테이블에 레코드가 삽입됩니다 PERSON_ID_DOCUMENTS
.
반면 idDocument.setPerson(person)
에을 호출하면 table의 외래 키 person_id를 변경합니다 ID_DOCUMENTS
. Hibernate는 하나의 양방향 객체 관계 를 구현하기 위해 데이터베이스에 두 개의 단방향 (외부 키) 관계를 생성하고 있다.
소유 측 개념이 문제를 해결하는 방법 :
우리가 원하는 것은 여러 번 테이블에 ID_DOCUMENTS
대한 외래 키 PERSONS
와 추가 연결 테이블입니다.
이 문제를 해결하려면 Hibernate가 relation에 대한 수정 사항 추적을 중지하도록 구성해야합니다 Person.idDocuments
. 최대 절전 모드는 관계 의 다른 쪽만 추적해야하며 IdDocument.person
그렇게하려면 mapBy 를 추가하십시오 .
@OneToMany(mappedBy="person")
private List<IdDocument> idDocuments;
MappingBy 무엇을 의미합니까?
"관계의이 측면에 대한 수정은 이미
IdDocument.person 관계의 다른쪽에 의해 매핑 되었으므로 별도의 테이블에서 별도로 추적 할 필요가 없습니다."
GOTCHA, 결과가 있습니까?
사용 mappedBy을 우리는 호출하면 person.getDocuments().add(document)
, 외래 키 ID_DOCUMENTS
것 NOT 이 관계의 소유 / 추적 측이 없기 때문에, 새 문서에 링크!
문서를 새로운 사람에게 링크하려면 관계 document.setPerson(person)
의 소유 측면 이므로 명시 적으로 호출해야합니다 .
MappingBy를 사용 하는 경우 데이터베이스에서 새 관계의 지속성을 트리거하기 위해 소유 측이 무엇인지 알고 관계의 올바른 측면을 업데이트하는 것은 개발자의 책임입니다.