[java] ORM 매핑에서 “소유 측”이란 무엇입니까?

소유 측은 정확히 무엇을 의미합니까? 일부 매핑 예 ( 일대 다, 일대일, 다 대일 )에 대한 설명은 무엇입니까 ?

다음 텍스트는 Java EE 6 문서 의 @OneToOne 설명에서 발췌 한 것입니다 . 개념 소유 측면 을 볼 수 있습니다 .

일대일 다중성을 갖는 다른 엔터티에 대한 단일 값 연결을 정의합니다. 연관된 대상 엔티티는 일반적으로 참조되는 오브젝트의 유형에서 유추 될 수 있으므로 일반적으로 연관된 대상 엔티티를 명시 적으로 지정할 필요는 없습니다. 관계가 양방향 인 경우 비 소유 측은 OneToOne 어노테이션의 mappingBy 요소를 사용하여 소유 측 의 관계 필드 또는 특성을 지정해야합니다.



답변

소유 측의 개념이 필요한 이유는 무엇입니까?

양방향 관계의 소유 측면에 대한 아이디어는 관계형 데이터베이스에서 객체의 경우와 같이 양방향 관계가 없다는 사실에서 비롯됩니다. 데이터베이스에는 단방향 관계-외래 키 만 있습니다.

‘소유자’라는 이름의 이유는 무엇입니까?

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 관점에서이 매핑은 하나의 양방향 관계가 아니라 두 개의 개별적인 단방향 관계를 정의합니다.

매핑은 테이블 PERSONSID_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)
)

기본 키주의 pkID_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_DOCUMENTSNOT 이 관계의 소유 / 추적 측이 없기 때문에, 새 문서에 링크!

문서를 새로운 사람에게 링크하려면 관계 document.setPerson(person)소유 측면 이므로 명시 적으로 호출해야합니다 .

MappingBy를 사용 하는 경우 데이터베이스에서 새 관계의 지속성을 트리거하기 위해 소유 측이 무엇인지 알고 관계의 올바른 측면을 업데이트하는 것은 개발자의 책임입니다.


답변

소유 측 이 다른 쪽을 참조하는 엔티티라고 상상할 수 있습니다 . 발췌문에서는 일대일 관계입니다. 대칭 관계 이기 때문에 객체 A가 객체 B와 관련이 있고 그 반대의 경우도 마찬가지입니다.

이는 객체 A에 객체 B에 대한 참조를 저장하고 객체 B에 객체 A에 대한 참조를 저장하는 것이 중복됨을 의미합니다. 따라서 객체를 참조하는 다른 객체를 “소유하는”객체를 선택합니다.

일대 다 관계가있는 경우 “다수”부분과 관련된 개체는 소유 측이되며, 그렇지 않으면 단일 개체에서 여러 개체에 대한 많은 참조를 저장해야합니다. 이를 피하기 위해 두 번째 클래스의 모든 객체는 참조하는 단일 객체에 대한 포인터를 갖습니다 (따라서 소유 측이됩니다).

다 대 다 관계의 경우 어쨌든 별도의 매핑 테이블이 필요하므로 소유 측면이 없습니다.

결론적으로 소유 측은 다른 쪽을 참조하는 실체입니다.


답변