hibernate 입문(8): 다대다
전형적인 실례: 한 학생은 여러 명의 선생님이 있을 수 있고 같은 학생은 여러 명의 학생이 있을 수 있다. 이에 대해 다음과 같이 설계한다.
학생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>
설명: 마지막
<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, 따라서 여기 있는
>> 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의'다대다'실현도 두 개의'일대다'로 전환해서 실현할 수 있다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
정수 반전Udemy 에서 공부 한 것을 중얼거린다 Chapter3【Integer Reversal】 (예) 문자열로 숫자를 반전 (toString, split, reverse, join) 인수의 수치 (n)가 0보다 위 또는 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.