ORM 매핑의 '소유측'이란 무엇입니까?
소유자가 정확히 무엇을 의미합니까?몇 가지 매핑 예(일 대 다, 일 대 일, 다 대 일)에 대한 설명은 무엇입니까?
다음 텍스트는 Java EE 6 문서의 @OneToOne 설명에서 발췌한 것입니다.개념 소유의 측면을 볼 수 있습니다.
1 대 1의 멀티시티를 가지는 다른 엔티티와의 단일값 어소시에이션을 정의합니다.일반적으로 연관된 대상 엔티티는 참조되는 객체의 유형에서 유추할 수 있으므로 일반적으로 명시적으로 지정할 필요는 없습니다.관계가 양방향인 경우 비소유측은 OneToOne 주석의 mappedBy 요소를 사용하여 소유측의 관계 필드 또는 속성을 지정해야 합니다.
소유 측의 개념이 필요한 이유는 무엇입니까?
쌍방향 관계를 소유한다는 개념은 관계형 데이터베이스에서는 객체의 경우와 같은 쌍방향 관계가 존재하지 않는다는 사실에서 비롯됩니다.데이터베이스에는 단방향 관계, 즉 외부 키만 있습니다.
소유측이라는 이름의 이유는 무엇입니까?
Hibernate에 의해 추적되는 관계의 소유측은 데이터베이스의 외부 키를 소유하는 관계측입니다.
소유라는 개념이 해결하는 문제는 무엇입니까?
소유측을 선언하지 않고 매핑된2개의 엔티티의 예를 나타냅니다.
@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)
테이블상의 외부 키 person_id를 변경합니다.ID_DOCUMENTS
휴지상태는 데이터베이스에 2개의 단방향(외부 키) 관계를 생성하여 1개의 양방향 객체 관계를 구현합니다.
소유 측의 개념이 문제를 해결하는 방법:
대부분의 경우 우리가 원하는 것은 테이블 위에 있는 외래 키일 뿐이다.ID_DOCUMENTS
향해서PERSONS
추가 연관표 말고
이 문제를 해결하려면 Hibernate를 설정하여 관련 수정사항 추적을 중지해야 합니다.Person.idDocuments
휴지상태는 관계의 다른 쪽만 추적해야 합니다.IdDocument.person
mappedBy를 추가합니다.
@OneToMany(mappedBy="person")
private List<IdDocument> idDocuments;
mappedBy는 무슨 뜻입니까?
즉, "관계 이쪽의 변경은 IdDocument.person 관계 반대쪽의 Mapping By 이미 되어 있습니다.따라서 별도의 테이블에서 따로 추적할 필요가 없습니다."와 같은 의미입니다.
GOTCHA, 결과물이 있나요?
mappedBy 사용(콜만 하는 경우)person.getDocuments().add(document)
, 의 외부 키ID_DOCUMENTS
이 문서는 소유/추적된 관계가 아니므로 새 문서에 링크되지 않습니다.
문서를 새 사용자에게 연결하려면 명시적으로 전화해야 합니다.document.setPerson(person)
왜냐하면 그것은 관계의 소유측이기 때문입니다.
mappedBy를 사용하는 경우 개발자는 소유측을 파악하고 데이터베이스 내의 새로운 관계의 지속성을 트리거하기 위해 올바른 관계를 갱신할 책임이 있습니다.
소유측이 다른 엔티티에 대한 참조가 있는 엔티티라고 생각할 수 있습니다.발췌문에서 당신은 일대일로 관계를 맺고 있습니다.대칭관계이기 때문에 객체 A가 객체 B와 관련되어 있으면 그 반대도 참이 됩니다.
즉, 오브젝트 A에 오브젝트 B에 대한 참조를 저장하고 오브젝트 B에 오브젝트 A에 대한 참조를 저장하는 것은 장황함을 의미합니다.따라서 참조가 있는 다른 오브젝트를 "소유"하는 것을 선택합니다.
1 대 다의 관계가 확립되어 있는 경우, 「다수」부분과 관련된 오브젝트는 소유자가 됩니다.그렇지 않으면 단일 오브젝트에서 다수의 오브젝트에 대한 다수의 참조를 저장해야 합니다.이를 피하기 위해 두 번째 클래스의 모든 개체에는 참조하는 단일 개체로의 포인터가 있습니다(따라서 소유 측).
다대다 관계에서는 어차피 별도의 매핑테이블이 필요하기 때문에 소유측도 없습니다.
결론적으로 소유측이란 상대방을 참조하는 실체이다.
저는 이것에 대해 아주 간단하게 설명하겠습니다."소유 중"은 외부 키 컬럼을 그 자체로 운반하는 것을 의미합니다.다른 말로 하자면, 그것은 관계를 소유합니다.많은 사람들이 소유라는 단어를 오해한다.그들은 소유자가 주요 정당이라고 생각한다.그런데 보면 외부 키 열이 있는 테이블이 링크된 쪽입니다.예: 인물과 주소, 그리고 그들 사이의 관계에 대해 생각해 봅시다 OneToOne
@Data
@Entity
public class Person {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
@OneToOne
@JoinColumn(name = "adress_id")
private Adress adress;
}
@Data
@Entity
public class Adress {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@OneToOne(mappedBy = "adress")
private Person person;
}
이 경우 Person은 기본 키 열의 Address와 링크된 address_id fk 열을 가집니다.
일반적으로, 왜 소유권이 나에게 필요한가?라고 생각할지도 모른다.이를 이해하려면 데이터베이스 규칙을 알아야 합니다.예를 들어, 소유측과 모든 데이터 저장소를 한 테이블에 사용하지 않을 경우 잘못된 데이터베이스 방식을 구현해야 합니다.이제 각 엔티티는 각자의 테이블에 데이터를 저장해야 한다는 것을 이해하셨으리라 생각합니다.이제 보기 섹션에 사용자와 주소를 표시하라는 메시지가 나타납니다.소유권이 없다면 어떻게 하겠습니까?각 엔티티에 대해 2개의 쿼리를 작성해야 합니다.여기서도 DML을 잘못 작성했습니다. 2개의 쿼리를 작성하는 대신, 1개의 쿼리를 작성할 수 있습니다.JOIN
JOIN은 소유측에서 작업하기 때문에 이들 없이는 다른 테이블에서 한 테이블에 속하는 데이터를 선택할 수 없습니다.또한 ORM은 데이터베이스를 사용하지 않고 엔티티를 통해 기본 Java 코드를 사용함으로써 보다 편안한 방법을 제공합니다.바로 그겁니다.
쌍방향 관계는 다음 규칙을 따라야 합니다.
쌍방향 관계의 역방향은 @OneToOne, @OneToMany 또는 @ManyToMany 주석의 mappedBy 요소를 사용하여 소유측을 참조해야 합니다.mappedBy 요소는 관계의 소유자인 엔티티 내의 속성 또는 필드를 지정합니다.
다대일 쌍방향 관계의 다방면에서 mappedBy 요소를 정의해서는 안 됩니다.관계에서 다방면의 소유자는 항상 있다.(Oracle 문서에 따르면 https://docs.oracle.com/cd/E19798-01/821-1841/bnbqi/index.html)
일대일 쌍방향 관계에서는 소유측은 대응하는 외부 키를 포함한 측에 대응합니다.
다대다 쌍방향 관계에서는 어느 한쪽이 소유자가 될 수 있습니다.
그게 많은 도움이 되네.나는 이 토론을 지지한다.
특히 병원 관리 시스템에서 다음과 같은 활용 사례를 찾고 있었습니다.환자 -> 환자 이력 1.환자는 환자의 병력에 의존하지 않는다. 즉, 환자가 처음 병원을 방문했을 때만 환자의 병력이 추가되어야 한다.2 .이후 방문 시 기록이 기록 테이블에 추가되지만 Patient_id 참조가 필요합니다.여기서 forign 키는 Patient(환자)에 있습니다.HIstory 테이블, 소유 쪽은 PatientHistory입니다.
따라서 이 관계는 환자 엔티티에서 Bi-Directional OneToMany, mappby="환자"로 모델링해야 합니다.각 엔티티는 서로 참조합니다.
언급URL : https://stackoverflow.com/questions/2749689/what-is-the-owning-side-in-an-orm-mapping
'programing' 카테고리의 다른 글
플라스크 앱을 여러 개의 py 파일로 분할하는 방법은 무엇입니까? (0) | 2022.11.01 |
---|---|
MARIADB - QUERY 패킷 전송 중 오류 발생(max_allowed_packet 아님) (0) | 2022.11.01 |
SQL Chemy - 테이블 목록 가져오기 (0) | 2022.11.01 |
ReactJS - "setState"가 호출될 때마다 렌더가 호출됩니까? (0) | 2022.11.01 |
로드 시 Larabel/Allustive 모델에 사용자 지정 속성을 추가하시겠습니까? (0) | 2022.11.01 |