hibernate 입문(8): 다대다

4. 다중 쌍 다중 관계 매핑:
전형적인 실례: 한 학생은 여러 명의 선생님이 있을 수 있고 같은 학생은 여러 명의 학생이 있을 수 있다. 이에 대해 다음과 같이 설계한다.
학생studnet표:
column
id
name
teachers
선생님 티처표:
column
id
name
studnets
학생들이 그의 모든 선생님을 찾아내는 것을 이용하여 우리는 보통 중간표를 디자인하여 찾습니다. 중간표는 학생과 선생님을 연결시키고 이 표를 통해 학생과 선생님 간의 상호작용을 찾습니다.
중간표 티처student:
column
teacher_id
studnet_id
 
복합 키
데이터베이스 작업에서 다음과 같은 설명을 한다. 만약에 선생님을 통해 학생을 찾으면 과정: 먼저 티처표를 통해 id를 찾은 다음에 티처student표에 팀버로.id==teacher_student.teacher_id는 검색 조건으로 studnent 찾기id, studnet 찾기id 후, 다시 teacherstudent.stucent_id==student.id는 모든 학생의 정보를 찾기 위한 검색 조건입니다.학생을 통해 선생님을 찾는 것도 비슷한 과정이다.
>> 1단계, 솔리드 클래스 Student, Teacher 작성
Student 클래스의 내용은 다음과 같습니다. getXXX(), setXXX() 방법을 생략합니다.
package com.asm.hibernate.domain;
import java.util.Set;
public class Student {
	private int id;
	private String name;
	private Set<Teacher> teachers;	
}

 
Teacher 클래스의 내용은 다음과 같습니다. getXXX(), setXXX() 방법을 생략합니다.
package com.asm.hibernate.domain;
import java.util.Set;
public class Teacher {
	private int id;
	private String name;
	private Set<Student> students;	
}

 
>> 2단계, 두 개의 실체를 위한 프로필 만들기 (앞의 xml 문서 설명 내용을 생략함):Student.hbm.xml 내용은 다음과 같습니다.
<hibernate-mapping 
	package="com.asm.hibernate.domain">
	<class name="Student">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"></property>
		<set name="teachers" table="teacher_student">
			<key column="student_id" />
			<many-to-many class="Student" column="teacher_id"/>
		</set>
	</class>
</hibernate-mapping>

 
설명: 마지막 설정을 중점적으로 설명합니다. (1) Student에서 Set 유형의 속성 설정은 요소입니다. 사실 앞의 한 쌍의 여러 쌍에 요소의 설정이 나타났습니다. 우리는'어떤 Set 유형의 속성을 비추어 설정하려면 요소로 설정할 수 있습니다'라고 생각할 수 있습니다.set>의 테이블 속성은 관련 테이블의 이름입니다.(2) 하위 요소 의column은 관련 테이블에서 이 맵 파일이 비추는 테이블의 메인 키를 외부 키로 하는 필드 이름입니다.(3) coumn 속성은 관련 테이블에서 관련 클래스에 대응하는 테이블의 메인 키를 외부 키로 하는 필드 이름입니다.Teacher.hbm.xml 내용은 다음과 같습니다.
<hibernate-mapping 
	package="com.asm.hibernate.domain">
	<class name="Teacher">
		<id name="id">
			<generator class="native"/>
		</id>
		<property name="name"></property>
		
		<set name="students" table="teacher_student">
			<key column="teacher_id" />
			<many-to-many class="Student" column="student_id"/>
		</set>
	</class>
</hibernate-mapping>

 
Student 때문에.hbm.xml은 유사합니다. 여기에 설명을 하지 않아도 양방향의 다대다 관련을 구축할 수 있습니다.
그들이 의존하는 중간표는 티처student, 따라서 여기 있는 요소의 테이블 속성은 티처 맵 파일과 같습니다. 특히 의column 속성 값의 설정에 주의해야 합니다.
>> 3단계, 기본 프로파일에서 엔티티 프로파일을 연결하려면 다음과 같이 하십시오.


>> 4단계, 테스트 파일 ManyToManyTest 작성java: 가져온 패키지를 생략합니다.
package com.asm.hibernate.test;
public class ManyToManyTest {
	public static void main(String[] args) {
		add();
	}

	static void add() {
		Session s = null;
		Transaction tr = null;
		try {
			s = HibernateUtil.getSession();
			tr = s.beginTransaction();

			Teacher t1 = new Teacher();
			t1.setName("t1Name");

			Teacher t2 = new Teacher();
			t2.setName("t2Name");

			Student s1 = new Student();
			s1.setName("s1Name");

			Student s2 = new Student();
			s2.setName("s2Name");

			//            :
			Set<Teacher> ts = new HashSet<Teacher>();
			ts.add(t1);
			ts.add(t2);
			Set<Student> ss = new HashSet<Student>();
			ss.add(s1);
			ss.add(s2);

			t1.setStudents(ss);
			t2.setStudents(ss);

			// s1.setTeachers(ts);
			// s2.setTeachers(ts);
			//      
			s.save(s1);
			s.save(s2);
			s.save(t1);
			s.save(t2);
			tr.commit();

		} finally {
			if (s != null)
				s.close();
		}
	}
}

설명: 위에서 설명한 내용을 주의하세요. 삭제하면 이상이 생길 수 있습니다.이해: 추가된 내용을 추가한 후 실행한 결과'데이터베이스 디스플레이'기능을 오픈한 후 컨트롤러에 네 개의 삽입문이 추가되었고 중간표 티처student에서는 모든 학생에게 관련된 선생님을 알려주는 것과 같다. mysql 클라이언트에서'show create table teacher student'를 실행하고 그 표 구조를 관찰하고'주석을 제거한 오류 설명'을 결합하면 주석이 없는 내용을 쉽게 이해할 수 있다.다른 설명이 필요한 것은'다대다'는 조작과 성능 면에서 모두 이상적이지 않기 때문에 사용이 비교적 적다. 일반적으로 우리는'일대다'모델로 전환하는 것을 선택하는데 Hiberante의'다대다'실현도 두 개의'일대다'로 전환해서 실현할 수 있다.

좋은 웹페이지 즐겨찾기