Hibernate 일대일 관계
외부 키 기반 맵 의 일대일
홈 키 맵 기반 1 대 1
외부 키 기반 맵 의 일대일
이러한 매 핑 은 다 대 일 로 이 루어 집 니 다. 이러한 매 핑 상황 에서 외 키 는 임의의 한 끝 에 놓 을 수 있 습 니 다. 외 키 를 저장 해 야 하 는 한 끝 (a 단 으로 약칭) 에 < many - to - one > 노드 를 추가 하여 < many - to - one > 노드 에 유 니 크 를 추가 할 수 있 습 니 다 = "true" 속성 으로 다 대 일 을 1 대 1 로 제약 하고 다른 한 끝 (b 단 으로 약칭) 은 < one - to - one > 노드 로 매 핑 합 니 다.또한 property - ref 속성 을 추가 하여 이 단 (b 단) 과 연 결 된 다른 단 (a 단) 에 사용 할 비 메 인 키 필드 를 관련 필드 로 지정 합 니 다. 이 말 은 비교적 까다 롭 습 니 다. 다음은 예 를 들 어 보고 이해 하 겠 습 니 다.
예 를 들 어 모델 은 부서 (Department) 와 매니저 (Manager) 이다.
package com.demo.one2one.foreign;
public class Department {
private Integer id;
private String deptName;
private Manager mgr;
get/set
}
package com.demo.one2one.foreign;
public class Manager {
private Integer id;
private String mgrName;
private Department dept;
get/set
}
<hibernate-mapping package="com.demo.one2one.foreign">
<class name="Department" table="DEPARTMENT">
<id name="id" type="java.lang.Integer">
<column name="DEPT_ID" />
<generator class="native" />
</id>
<property name="deptName" type="java.lang.String">
<column name="DEPT_NAME" />
</property>
<!-- many-to-one 1-1 -->
<!-- unique: true , , -->
<many-to-one name="mgr" class="Manager" column="MRG_ID" unique="true"></many-to-one>
</class>
</hibernate-mapping>
<hibernate-mapping package="com.demo.one2one.foreign">
<class name="Manager" table="MANAGER">
<id name="id" type="java.lang.Integer">
<column name="MGR_ID" />
<generator class="native" />
</id>
<property name="mgrName" type="java.lang.String">
<column name="MGR_NAME" />
</property>
<!-- one-to-one -->
<!-- property-ref (Department) -->
<one-to-one name="dept" class="Department" property-ref="mgr"></one-to-one>
</class>
</hibernate-mapping>
빈 테스트 를 간단하게 실행 하면 두 개의 시 계 를 볼 수 있 고 depart. ment 표 에 외 키 mgr 가 있 습 니 다.id manager 표 의 메 인 키 mgr 참조id, 또한 색인 란 에서 depart. ment 표 는 메 인 키 의 유일한 색인 을 제외 하고 하나의 외 키 열 에 있 는 유일한 색인 을 볼 수 있 습 니 다. 이것 은 Department 설정 파일 의 < many - to - one > 노드 에 유 니 크 = "true" 를 추가 하 는 역할 입 니 다.
다음은 왜 property - ref 를 추가 해 야 하 는 지, 아래 의 예 (데이터 삽입 부분 생략) 를 살 펴 보 겠 습 니 다. 여기 서 property - ref 속성 을 먼저 삭제 합 니 다.
@Test
public void testGet() throws Exception{
Department department = (Department) session.get(Department.class, 1);
System.out.println(department.getDeptName());
System.out.println(department.getMgr().getMgrName());
}
다음은 콘 솔 인쇄 결과 입 니 다.
Hibernate:
select
department0_.DEPT_ID as DEPT_ID1_0_0_,
department0_.DEPT_NAME as DEPT_NAM2_0_0_,
department0_.MRG_ID as MRG_ID3_0_0_
from
DEPARTMENT department0_
where
department0_.DEPT_ID=?
d-aa
Hibernate:
select
manager0_.MGR_ID as MGR_ID1_1_1_,
manager0_.MGR_NAME as MGR_NAME2_1_1_,
department1_.DEPT_ID as DEPT_ID1_0_0_,
department1_.DEPT_NAME as DEPT_NAM2_0_0_,
department1_.MRG_ID as MRG_ID3_0_0_
from
MANAGER manager0_
left outer join
DEPARTMENT department1_
on manager0_.MGR_ID=department1_.DEPT_ID
where
manager0_.MGR_ID=?
m-aa
언뜻 보기에 결 과 는 틀린 것 이 없 지만 여기 서 sql 문 구 는 문제 가 생 겼 습 니 다. Hibernate 는 표 의 왼쪽 연결 sql 을 사용 하여 데 이 터 를 조회 하 는 것 을 볼 수 있 습 니 다. 그러나 제한 조건 에 문제 가 생 겼 습 니 다. manager 의 mgr 일 것 입 니 다.id 는 depart. ment 의 mgrdepart. ment 가 아 닌 id deptid, 이것 은 Manager 의 설정 파일 에 property - ref 를 추가 하지 않 을 때 왼쪽 연결 조건 은 기본적으로 depart. ment 의 메 인 키 필드 이기 때 문 입 니 다. 이것 은 분명히 우리 가 보고 싶 지 않 은 것 이 고 property - ref = "mgr" 를 추가 한 후에 결 과 는 다음 과 같 습 니 다.
Hibernate:
select
department0_.DEPT_ID as DEPT_ID1_0_0_,
department0_.DEPT_NAME as DEPT_NAM2_0_0_,
department0_.MRG_ID as MRG_ID3_0_0_
from
DEPARTMENT department0_
where
department0_.DEPT_ID=?
d-aa
Hibernate:
select
manager0_.MGR_ID as MGR_ID1_1_1_,
manager0_.MGR_NAME as MGR_NAME2_1_1_,
department1_.DEPT_ID as DEPT_ID1_0_0_,
department1_.DEPT_NAME as DEPT_NAM2_0_0_,
department1_.MRG_ID as MRG_ID3_0_0_
from
MANAGER manager0_
left outer join
DEPARTMENT department1_
on manager0_.MGR_ID=department1_.MRG_ID
where
manager0_.MGR_ID=?
Hibernate:
select
department0_.DEPT_ID as DEPT_ID1_0_0_,
department0_.DEPT_NAME as DEPT_NAM2_0_0_,
department0_.MRG_ID as MRG_ID3_0_0_
from
DEPARTMENT department0_
where
department0_.MRG_ID=?
m-aa
이렇게 하면 우리 가 원 하 는 왼쪽 연결 이 되 고, 나머지 테스트 는 앞의 글 과 차이 가 크 지 않 으 므 로, 스스로 테스트 하여 관찰 할 수 있다.
홈 키 기반 일대일 매 핑 관계
메 인 키 의 일대일 맵 을 바탕 으로 그 원 리 는 한 측의 메 인 키 가 자동 으로 생 성 되 거나 다른 데이터 베이스 베이스 베이스 방식 으로 생 성 되 지 않 고 다른 측의 메 인 키 에 따라 자신의 메 인 키 를 생 성 하 는 것 이다.
이 원리 에 따 르 면 하 이 버 네 이 트 에서 의 방법 은:
1. 메 인 키 는 다른 쪽 의 메 인 키 에 의존 하여 생 성 되 는 한쪽 (a 단) 이 필요 합 니 다. 메 인 키 생 성 방식 은 foreign 정책 입 니 다. '상대방' 의 메 인 키 에 따라 자신의 메 인 키 를 생 성 하 는 것 을 나타 내 고 < param > 하위 노드 를 추가 하여 현재 지구 화 류 의 어떤 속성 에 대응 하 는 클래스 의 데이터 시트 (b 단) 를 '상대방' 으로 지정 해 야 합 니 다.
2. foreign 메 인 키 생 성기 정책 의 한 끝 (a 단) 은 one - to - one 노드 관련 맵 속성 을 추가 해 야 합 니 다. one - to - one 노드 에 constrained = "true" 속성 을 추가 해 야 합 니 다.다른 쪽 (b 쪽) 에 one - to - one 요소 맵 관련 속성 추가
이로써 Department 의 프로필 을 수정 합 니 다.
<hibernate-mapping package="com.demo.model.one2one.primary">
<class name="Department" table="DEPARTMENT">
<id name="id" type="java.lang.Integer">
<column name="DEPT_ID" />
<!-- -->
<generator class="foreign">
<!-- property -->
<param name="property">mgr</param>
</generator>
</id>
<property name="deptName" type="java.lang.String">
<column name="DEPT_NAME" />
</property>
<!-- foreign one-to-one -->
<!-- constrained="true" , -->
<one-to-one name="mgr" class="Manager" constrained="true"></one-to-one>
</class>
</hibernate-mapping>
Manager 의 프로필 은 일반 pojo 류 의 프로필 입 니 다.
<hibernate-mapping package="com.demo.model.one2one.primary">
<class name="Manager" table="MANAGER">
<id name="id" type="java.lang.Integer">
<column name="MGR_ID" />
<generator class="native" />
</id>
<property name="mgrName" type="java.lang.String">
<column name="MGR_NAME" />
</property>
<one-to-one name="dept" class="Department"></one-to-one>
</class>
</hibernate-mapping>
빈 테스트 를 실행 하면 Department 표 의 메 인 키 dept 를 볼 수 있 습 니 다.id 는 외부 키 이기 도 합 니 다. Manager 표 의 mgr 참조id, 색인 표시 줄 에 메 인 키 의 색인 이 있 지만 색인 형식 은 유 니 크 가 아 닌 Normal 입 니 다. 이 는 Department 표 의 메 인 키 가 Manager 표 의 메 인 키 에 따라 생 성 되 는 것 이지 자주 생 성 되 는 것 이 아니 라 는 것 을 증명 합 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[JPA] 즉시로딩(EAGER)과 지연로딩(LAZY) (왜 LAZY 로딩을 써야할까?) (1)Proxy는 이 글의 주제인 즉시로딩과 지연로딩을 구현하는데 중요한 개념인데, 일단 원리는 미뤄두고 즉시로딩과 지연로딩이 무엇인지에 대해 먼저 알아보자. 눈 여겨 볼 곳은 'fetch = FetchType.EAGER...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.