Hibernate 일대일 관계

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 표 의 메 인 키 에 따라 생 성 되 는 것 이지 자주 생 성 되 는 것 이 아니 라 는 것 을 증명 합 니 다.

좋은 웹페이지 즐겨찾기