Hibernate 독서 노트 - Hibernate 의 관련 맵 N - 1 관련 맵

7654 단어 Hibernate
우리 가 사 는 세상 에는 고립 된 존재 가 거의 없고 모든 사물 에는 반드시 그것 과 관련 된 사물 이 존재 할 것 이다.대상 을 대상 으로 하 는 디자인 에서 관련 관 계 는 매우 중요 하 다.관련 관 계 는 일반적으로 다음 과 같은 두 가지 로 나 눌 수 있다.
단 방향 관계: 단 방향 접근 관련 단
양 방향 관계: 관련 된 양 끝 은 서로 방문 할 수 있 습 니 다.
단 방향 관 계 는 1 - N, 1 - 1, N - 1, N - N 으로 나 눌 수 있다.
양 방향 관 계 는 1 - 1, 1 - N, N - N 으로 나 눌 수 있다.
다음은 위의 모든 관련 맵 에 대해 설명 합 니 다.
1. N - 1 관련 맵
1. 단 방향 N - 1 관련
1.1. 연결 표 가 없 는 N - 1 연결 (외부 키 기반 N - 1 연결)
단 방향 N - 1 관련 에 있어 서 N 의 한 끝 에서 1 의 한 끝 에 만 접근 할 수 있 습 니 다.이 두 개의 지구 화 클래스 가 이러한 관련 맵 을 지원 하도록 하기 위해 서 프로그램 은 N 의 한 끝 에 있 는 지구 화 클래스 에 익숙 함 을 추가 해 야 합 니 다. 이 속성 은 1 개의 관련 실 체 를 참조 합 니 다.
두 개의 관련 속성 은 다음 과 같다 (직원 과 부서 간 의 관 계 를 예 로 들 면).
Employee:
public class Employee {
	private Integer id;
	private String name;
	private Department department;    //    

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Department getDepartment() {
		return department;
	}

	public void setDepartment(Department department) {
		this.department = department;
	}

}

Department:
public class Department {
	private Integer id;
	private String name;
	private Set<Employee> employees;

	public Integer getId() {
		return id;
	}

	public void setId(Integer id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Set<Employee> getEmployees() {
		return employees;
	}

	public void setEmployees(Set<Employee> employees) {
		this.employees = employees;
	}

}

Employee 엔 드 는 Department 속성 을 추 가 했 습 니 다. 이 속성 은 일반적인 구성 요소 속성 이 아니 라 다른 지구 화 클래스 를 참조 합 니 다.Hibernate 는 < many - to - one... / > 요 소 를 사용 하여 N - 1 의 관련 실 체 를 매 핑 합 니 다. 직접 < many - to - one.. / > 요 소 를 사용 하여 관련 실 체 를 매 핑 하면 N 의 한쪽 데이터 시트 에 외부 키 를 추가 하여 메 인 시트 기록 을 참조 합 니 다.
다음은 두 실체의 맵 파일 입 니 다.
Employee.hbm.xml
이 맵 파일 에 서 는 < many - to - one.. / > 로 관련 맵 을 완성 해 야 합 니 다.
<hibernate-mapping package="com.hibernate.domain">
	<class name="Employee" table="employee">
		<id name="id" column="employeeID">
			<generator class="native" />
		</id>
		
		<property name="name" column="employeeName" />
		<!--     N-1    ,         :Department,     :departmentID-->
		<many-to-one class="Department" name="department" column="departmentID" not-null="true"    cascade="all"/>	
	</class>
</hibernate-mapping>

Department.hbm.xml
<hibernate-mapping package="com.hibernate.domain" >
	<class name="Department" table="department">
		<id name="id" column="departmentID">
			<generator class="native" />
		</id>
		
		<property name="name" column="departmentName" />
	</class>
</hibernate-mapping>

위의 맵 을 통 해 다음 코드 를 사용 하여 Employee 와 Department 실 체 를 저장 할 수 있 습 니 다.
	//  
	static void add() {
		Session s = null;
		Transaction tx = null;
		try {
			s = HibernateUtil.getSession();
			tx = s.beginTransaction();
			
			Department depart = new Department();           //....1
			depart.setName("   ");

			Employee emp = new Employee();
			//    :           
			emp.setDepartment(depart);                     //...2 
			emp.setName("   ");
			
			s.save(depart);                               //...3
			s.save(emp);                                  //...4
	
			tx.commit();
		} finally {
			if (s != null)
				s.close();
		}
	}

코드 분석:
코드 가... 1 로 실 행 될 때 과도 한 Department 대상 을 만 듭 니 다.프로그램 이... 3 과... 4 까지 실 행 될 때 시스템 은 Department 대상 과 Employee 대상 을 각각 저장 합 니 다.다음 두 개의 SQL 문 구 를 생 성 합 니 다.
        Hibernate: insert into department (departmentName) values (?)

Hibernate: insert into employee (employeeName, departmentID) values (?, ?)


Department 와 Employee 두 대상 의 관 계 를 맺 기 때문에 이 문 구 는 매우 중요 하 다.이 문구 가 없 으 면 두 대상 의 관 계 를 맺 을 수 없다.
여기 서 우 리 는... 세 문장 과... 네 문장 을 위 치 를 교환 할 것 이다.이 때 실행 하면 세 개의 SQL 문장 이 생 긴 다.... 3 일 때 depart. ment ID 가 삽입 되 었 을 때 비어 있 고 Department 대상 이 오래 지속 되면 시스템 은 department ID 를 해당 하 는 값 으로 수정 합 니 다.다음 과 같다.
Hibernate: insert into employee (employeeName, departmentID) values (?, ?)

Hibernate: insert into department (departmentName) values (?)

Hibernate: update employee set employeeName=?, departmentID=? where employeeID=?


만약 우리 가 Employee. hbm. xml 맵 파일 에 외부 키 에 비 어 있 는 제약 조건 을 추가 하면:
<many-to-one class="Department" name="department" column="departmentID" not-null="true"/>


위의 코드 는 비어 있 습 니 다: org. hibenate. Property Value Exception: not - nulproperty referencesanullortransientvalue.
만약 우리 가 위의 코드 를 바 꾸 고 싶 지 않다 면, 또 실행 할 수 있 을 것 이다.시계 에서 부터 오래 지속 하 는 것 이다.이러한 상황 에 대해 우 리 는 캐 스 케 이 드 = "all" 을 설정 할 수 있다. 즉,
<many-to-one class="Department" name="department" column="departmentID" not-null="true" cascade="all"/>。

캐 스 케 이 드 = "all" 을 지정 하 였 습 니 다.이것 은 시스템 이 먼저 자동 으로 메 인 테이블 기록 에 연결 되 는 것 을 의미한다.
따라서 모든 외부 키 제약 을 바탕 으로 하 는 관련 관계 에서 우 리 는 반드시 명심 해 야 한다. 메 인 테이블 에 대응 하 는 실 체 를 먼저 지구 화하 거나 등급 연결 작업 을 설정 해 야 한다.그렇지 않 으 면 Hibernate 가 테이블 기록 에 삽입 하려 고 할 때 테이블 에서 참조 할 메 인 테이블 기록 이 존재 하지 않 는 것 을 발견 하면 반드시 이상 을 던 집 니 다.
2. 연결 표 가 있 는 N - 1 연결
대부분의 단 방향 N - 1 관련 에 대해 서 는 외부 키 기반 의 관련 맵 을 사용 하면 된다.단, 연결 표를 사용 하여 단 방향 N - 1 연결 을 표시 하려 면 < join... / > 요 소 를 사용 해 야 합 니 다. 이 요 소 는 한 종류의 속성 을 여러 표 에 강제로 표시 하 는 데 사 용 됩 니 다.
연결 표 에 < join... / > 요 소 를 매 핑 할 때 외부 키 연결 이 필요 합 니 다. 설정 파일 에 < key... / > 하위 요 소 를 추가 하여 외부 키 를 매 핑 하고 < join... / > 요소 에 < many - to - one... / > 하위 요 소 를 추가 하여 N - 1 의 관련 실 체 를 매 핑 해 야 합 니 다.다음 과 같다.
<hibernate-mapping package="com.hibernate.domain">
	<class name="Employee" table="employee">
		<id name="id" column="employeeID">
			<generator class="native" />
		</id>
		
		<property name="name" column="employeeName" />
		<!--   join          -->
		<join table="employee_department">
			<!--                  -->
			<key column="employeeID" />
			<!--                 -->
			<many-to-one name="department" class="Department" column="departmentID" />
		</join>	
	</class>
</hibernate-mapping>

이 강의 《 경량급 자바 기업 응용 실전 》 을 읽다.

좋은 웹페이지 즐겨찾기