1. 일방적 인 단방향 협회 매핑
일대일 관계의 객체 모델은 종종 일상 생활에서 볼 수 있습니다. 학생과 수업을 예로 들어 보겠습니다. 수업에는 여러 학생이 있으므로 수업과 학생들의 관계는 아래 그림과 같이 객체 모델에 매핑 된 일대일 관계입니다.
객체 모델은이 일대일 관계가 한쪽 끝에 의해 유지됨을 보여 주므로 관계 모델에 대한 매핑은 수업 분야에 여러 학생이있을 것이며, 이는 일대일 관계를 형성합니다. 학생 정보는 수업을 통해 얻을 수 있습니다. 해당 관계 모델은 다음과 같습니다.
1. 기본 구성
객체 모델을 사용하여 해당 관계 코드에 매핑하십시오. 관계 매핑을 수행 할 때는 한쪽 끝에 <일대일 태그를 추가해야합니다. 또한 한쪽 끝에 세트 속성을 추가해야합니다. 게으른로드를 지원 한 다음 매핑 파일에 세트 태그를 추가하고 일대일 관계를 지정하여 한쪽 끝에서 쿼리를하고 여러 개의 끝을 얻을 수 있습니다.
클래스 및 매핑 파일 :
모델의 가장 중요한 끝입니다. 이를 위해 해당 세트 속성을 추가하고 구성 파일에서 세트 태그를 추가해야합니다. 세트 태그에서 해당 <일대일> 객체를 구성 할 수 있습니다. 특정 클래스. 자바 객체 코드는 다음과 같습니다.
패키지 com.src.hibernate; java.util.set import; 공개 수업 수업 {private int id; public int getid () {return id; } public void setid (int id) {this.id = id; } public String getName () {return name; } public void setName (문자열 이름) {this.name = 이름; } 개인 문자열 이름; // SET은 개인 세트 학생의 게으른로드를 지원합니다. 공개 세트 getstudents () {반품 학생; } public void setStudents (set student) {this.students = 학생; }}세트 속성은 클래스 객체에 사용되지만 지연된로드 속성 만 설명하며 속성에 해당하는 객체를 구성하지 않습니다. 속성의 객체는 매핑 파일에 구성되어야합니다. 세트 태그를 추가하고 <일대일 태그를 세트 태그에 추가해야합니다. 특정 코드는 다음과 같습니다.
<? XML 버전 = "1.0"?> <! DocType Hibernate Mapping Public "-// Hibernate/Hibernate 매핑 DTD 3.0 // 테이블 = "t_classes"> <id name = "id"> <generator // id> <property name = "name"/> <set name = "studl"> <key column = "classid"> </key> <일대일 many> </one-to-many> </set> </class> </hibernate-mapping>
해당 학생 객체의 코드 및 매핑 파일에는 특별한 구성이 필요하지 않으며 일반적인 쓰기 방법에 따라 작성하면됩니다. 특정 구성 방법은 자세히 설명되지 않으며 매우 간단합니다. 구성 후 해당 SQL 문을 생성해야합니다. 객체 모델을 관계형 모델로 변환 할 때 Hibernate는 다음과 같이 해당 문을 생성합니다.
ALTER TABLE T_STUDENT 드롭 외국 키 FK4B9075705E0AFEFE 드롭 테이블 테이블이 존재하는 경우 t_classes 드롭 테이블이 존재하는 경우 t_class drop 테이블 t_student 테이블 t_classes (id auto_increment, varchar (255), 1 차 키 (id), varcrement, null auto_increment null null auto _increment nult null auto _increment를 만들어 정수, 기본 키 (ID)) 조정 테이블 T_student 추가 색인 추가 FK4B9075705E0AFEFE (ClassSID), 제약 조건 FK4B9075705E0AFEFE 이외 키 (ClassSID) 참조 T_CLASSES (ID)
생성 된 해당 관계 모델은 다음과 같습니다.
SQL 문 및 관계 모델을 비교하면 해당 테이블 간의 연관성은 외래 키를 통해 유지됩니다. 먼저 두 개의 테이블을 만들고 테이블의 기본 키를 지정하고 마지막으로 일대일 외국 키 연관 관계를 추가하십시오.
2. 기본 작업
데이터베이스의 작업은 읽기 및 쓰기에 지나지 않으며 수정은 또한 쓰기 유형입니다. 다음으로 데이터베이스에 작업을 작성하고 읽는 방법을 살펴 보겠습니다.
(1) 데이터 작성 :
데이터를 작성할 때는 일대일 관계에주의를 기울여야하므로 추가 할 때 여러 학생 수업을 추가해야합니다. 또한 해당 세트 속성이 클래스에 추가되므로 Hashset을 사용하여 학생 객체를 추가 할 때 추가해야하므로 일대일 관계를 실현할 수 있습니다. 특정 코드는 다음과 같습니다.
public void testsave2 () {세션 세션 = null; try {session = hibernateutils.getSession (); session.begintransaction (); 학생 1 = 신입생 (); Student1.setName ( "Zhangsan"); 세션 .save (학생 1); 학생 2 = 신입생 (); Student2.SetName ( "LISI"); 세션 .Save (학생 2); 클래스 클래스 = 새로운 클래스 (); classs.setName ( "classone"); set student = new Hashset (); 학생 .add (학생 1); 학생 .add (학생 2); 수업. 세트 스튜어티 (학생); // 데이터를 성공적으로 저장할 수 있지만 // 관계를 유지하기 위해 추가 업데이트 문이 발행됩니다. session.getTransaction (). commit (); } catch (예외 e) {e.printstacktrace (); session.getTransaction (). Rollback (); } 마침내 {hibernateutils.closesession (세션); }} 그런 다음 위의 테스트 케이스를 실행하여 생성 된 해당 데이터가 데이터베이스에 기록되면 다음과 같습니다.
(2) 데이터 읽기 :
쓰기 작업은 비교적 간단합니다. 로드 된 모든 객체를 과도 상태에 추가하고 해당 메소드를 실행하여 컨텐츠를 삽입하면됩니다. 그러나 해당 읽기 작업은 조금 더 복잡합니다. 모든 학생 대상을 얻기 위해 반복해야하기 때문에이 일대일 관계는 그다지 효율적이지 않습니다. 특정 코드는 다음과 같습니다.
패키지 com.test.hibernate; import java.util.iterator; java.util.set import; com.src.hibernate import.*; import junit.framework.testcase; import org.hibernate.session; Public Class One2Manytest는 테스트 케이스를 확장합니다 {public void testload1 () {세션 세션 = null; try {session = hibernateutils.getSession (); session.begintransaction (); // 기본 키 5 클래스 클래스 = (클래스) 세션 .LOAD (class.Class, 5); // 인쇄 클래스 정보 시스템 .out.println ( "class.name ="+class.getName ()); // 학생 세트를 설정하고 수업을 통해 세트를 설정하고로드하십시오. // 세트를 반복하고 (iterator iter = student.iterator (); iter.hasnext ();) {학생 student = (Student) iter.next (); System.out.println ( "wident.name ="+whitital.getName ()); } session.getTransaction (). commit (); } catch (예외 e) {e.printstacktrace (); session.getTransaction (). Rollback (); } 마침내 {hibernateutils.closesession (세션); }}}생성 된 해당 진술 및 정보는 다음과 같습니다.
Hibernate : classes0_.id as id1_0_, classes0_.name as t_classes classes0_ where classs0_.id =? classes.name=ClassOne Hibernate: select students0_.classesid as classid1_, students0_.id as id1_, students0_.id as id0_0_, students0_.name as name0_0_ from t_student students0_ where students0_.classesid=? 학생 .name = lisi student.name = zhangsan
2. 일회성 양방향 연관성 매핑
여기서 우리는 계속해서 학생과 수업을 예로 사용합니다. 수업과 학생 사이에는 일대일 관계가 있습니다. 수업에는 여러 학생이 있습니다. 이전 기사와 달리 여기의 관계는 양방향입니다. 즉, 한쪽 끝과 한쪽 끝은 동시에 관계를 유지하므로 객체 다이어그램은 다음과 같습니다.
해당 관계 모델 다이어그램은 크게 변하지 않습니다. 이들 사이의 관계는 양방향이기 때문에 관계 모델의 양쪽 끝은 동시에 관계 관계를 유지하고 아래 그림과 같이 관계 모델에 매핑합니다.
일대일 단방향 협회에서 매핑 파일은 한쪽 끝에서만 특별히 구성되면됩니다. <일대일> 구성을 사용하고 객체 모델의 세트 반복기를 사용하여 Outlinked 객체 모델을 설정하십시오. 그러나 차이점은 양방향 협회에서 다른 쪽 끝의 해당 외국 키 연관이 다중쪽에 추가되어야한다는 것입니다. 이 시점에서 <tover-one>의 관계는이 양방향을 나타 내기 위해 다중 끝에서 사용해야합니다.
1. 매핑
수업과 학생도 여기에서 예로 사용됩니다. 수업 끝의 내용은 위와 동일하며 변경되지는 않지만 여러 쪽 끝에서 학생들의 구성이 변경됩니다. 즉, <tole-one> 태그는 매핑 파일에 추가해야합니다.
Student.hbm.xml 매핑 파일 구성은 외래 키 열 <ult-to-one> 태그를 추가해야하며 열의 이름은 클래스의 외래 키 열의 이름과 일치해야합니다 .hbm.xml. 특정 코드는 다음과 같습니다.
<? XML 버전 = "1.0"?> <! DocType Hibernate Mapping Public "-// hibernate/hibernate 매핑 dtd 3.0 // 테이블 = "t_student"> <id name = "id"> <generator/generator/> </id> <속성 이름 = "name"/> <!-한쪽에 학생에 새 클래스 열을 추가하면 열 이름은 클래스 목록과 동일해야합니다. hb.xml-> <classe "classe" "classid">
class.hbm.xml 매핑 파일의 구성은 이전 기사와 동일합니다. 세트 속성 매핑이 클래스에 추가되며 학생 개체에 해당합니다. 따라서 세트 태그를 맵핑 파일에 추가하여 세트 반복기가 객체 모델에 사용되었음을 나타냅니다. 특정 구성은 다음과 같습니다.
<? xml version = "1.0"?> <! doctype hibernate hibernate public "-// hibernate/hibernate 매핑 dtd 3.0 // 테이블 = "t_classes"> <id name = "id"> <generator // id> <property name = "name"/> <set name = "student"inverse = "true"> <key column = "classeD"> </key> <일대일 "
2. 수업
매핑 파일의 구성은 클래스에 직접 해당하므로 매핑 파일을 사용하면 해당 클래스를 작성할 수 있습니다. 같은 클래스를 사용하면 해당 매핑 파일을 작성하는 방법을 알 수 있습니다. 해당 클래스 코드를 작성하는 방법을 살펴 보겠습니다.
학생 .java 클래스는 클래스에 관련 클래스 객체 속성을 추가해야하며 학생을로드 할 때 수업 관련 정보를 얻을 수 있습니다.
패키지 com.src.hibernate; 공개 수업 학생 {// 관련 수업 대상 개인 수업; 공개 클래스 getClasses () {반환 클래스; } public void setClasses (클래스 클래스) {this.classes = 클래스; } // 학생 ID 개인 int ID; public int getid () {return id; } public void setid (int id) {this.id = id; } // 학생 이름 개인 문자열 이름; 공개 문자열 getName () {return name; } public void setName (문자열 이름) {this.name = 이름; }} Class.java 파일의 특정 코드 내용은 이전 기사에 나와 있으며 여기에 자세히 설명되지 않습니다.
객체 모델을 사용하면 관계 모델이 생성됩니다. 생성 된 SQL 문은 다음과 같습니다.
ALTER TABLE T_STUDENT 드롭 외국 키 FK4B907570FC588BF4 드롭 테이블 T_CLASSES 드롭 테이블이 존재하는 경우 t_classes 드롭 테이블 T_Student Table T_CLASSES 생성 T_CLASSES (id integer null auto_increment, varchar (255), 1 차 키 (255)) (Id auto) 정수, 기본 키 (ID)) 조정 테이블 T_student 추가 색인 추가 FK4B907570FC588BF4 (ClassSID) 추가 제약 조건 FK4B907570FC588BF4 외국 키 (ClassSID) 참조 T_CLASSES (ID) 참조.
3. 데이터 작동
테이블 구조를 설정 한 후 데이터 작동을 확인하는 테스트 방법을 작성했습니다. 먼저 데이터 삽입을 살펴보고 테이블 구조에 데이터를 삽입 해 드리겠습니다. 데이터를 작성할 때 두 가지 상황이 있습니다. 하나는 먼저 클래스 객체를 만들고, 객체를 데이터베이스에 쓰고, 학생 객체를 만들고, 학생 개체를 클래스 객체에 추가하는 것입니다. 다른 하나는 먼저 학생 객체를 만들고, 학생 객체를 데이터베이스에 쓰고, 클래스 객체를 작성하여 학생 개체를 클래스 객체에 추가하는 것입니다. 이 두 가지 유형의 작업은 결국 다르므로 비교해 봅시다.
3.1 먼저 수업을 작성한 다음 학생들을 씁니다.
클래스를 먼저 데이터베이스에 작성한 후 클래스 객체는 과도 상태로 들어가 데이터베이스에 행이 있습니다. 그런 다음 학생 대상을 작성하십시오. 학생 객체는 해당 클래스 기본 키를 찾고 테이블에 씁니다. 따라서 관계 모델의 데이터는 비어 있지 않으며 저장된 코드는 다음과 같습니다.
public void testsave () {세션 세션 = null; 시도 {// 세션 생성 객체 세션 = hibernateutils.getSession (); // 트랜잭션 열기 세션 .BegIntransaction (); // 클래스 객체 생성 및 클래스 객체를 데이터베이스 클래스 클래스 = 새 클래스 (); class.setName ( "class"); 세션 .save (클래스); // 학생 1 객체 생성 및 데이터베이스에 학생 개체를 작성합니다. Student1 = new Student (); Student1.setName ( "Zhangsan"); 학생 1. 세트 클래스 (클래스); 세션 .save (학생 1); // 학생 2 객체를 만들고 학생 개체를 데이터베이스에 쓰기 학생 학생 2 = new Student (); Student2.SetName ( "LISI"); Student2.setClasses (클래스); 세션 .Save (학생 2); session.getTransaction (). commit (); } catch (예외 e) {e.printstacktrace (); session.getTransaction (). Rollback (); } 마침내 {hibernateutils.closesession (세션); }} 쓰기 데이터베이스의 해당 정보 목록은 다음과 같습니다.
3.2 학생들을 먼저 쓰고 수업을 작성하십시오
먼저 학생들을 데이터베이스에 쓰십시오. 현재 학생 테이블은 해당 클래스 열의 주요 주요 정보를 얻어야하지만 클래스 정보가 과도 상태로 변환되므로 학생 정보를 작성할 때는 널 값이 있습니다. 코드는 다음과 같습니다.
작성 후 해당 데이터베이스보기는 다음과 같습니다.
두 글쓰기 작업을 비교하면 두 글의 순서가 다르기 때문에 다른 결과가 나타나지만 양방향 연관성이기 때문에 글쓰기 중에는 예외가 발생하지 않습니다.
4. 작업을 읽으십시오
데이터 작성과 비교할 때 읽기 데이터는 매우 간단 해집니다. 양방향 연관성이기 때문에 데이터 읽기도 양방향입니다. 다음 코드에 표시된대로 다른 쪽 끝에서 얻은 정보는 다음과 같은 코드에서 읽을 수 있습니다.
public void testload1 () {세션 세션 = null; try {session = hibernateutils.getSession (); session.begintransaction (); // 수업 수업을 통해 학생 정보 읽기 = (클래스) session.load (class.class, 1); System.out.println ( "class.name ="+class.getName ()); set student = class.getstudents (); for (iterator iter = student.iterator (); iter.hasnext ();) {학생 학생 = (학생) iter.next (); System.out.println ( "wident.name ="+whitital.getName ()); } // 학생 정보를 통해 수업 정보 읽기 학생 stu = new Student (); stu = (학생) session.load (Student.class, 1); System.out.println ( "학생 클래스를 통한로드 클래스 정보 .id ="+stu.getClasses (). getId ()); session.getTransaction (). commit (); } catch (예외 e) {e.printstacktrace (); session.getTransaction (). Rollback (); } 마침내 {hibernateutils.closesession (세션); }}위의 테스트 명령문을 실행하면 생성 된 해당 명령문 정보는 다음과 같습니다.
Hibernate : classes0_.id as id1_0_, classes0_.name as t_classes classes0_ where classs0_.id =? class.name = class hibernate : select select select select select select select select select select select select select select select select select select select select select select select select select select select select select select seloce as student00_, student0_.id, ide10_.id as as student0_. 학생 .name = lisi student.name = zhangsan
학생들의 수업 정보로드 클래스 .id = 1