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>
이 강의 《 경량급 자바 기업 응용 실전 》 을 읽다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 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에 따라 라이센스가 부여됩니다.