1. 양방향 1 차 키 협회
양방향 1 차 키 협회는 실제로 일대일 1 차 키 협회의 특별한 경우입니다. 그러나 <일대일> 구성은 관련 객체의 양쪽 끝에있는 매핑 파일에서 수행해야하며, 또한 외국 외국 키 연관 속성을 기본 맵의 기본 키의 한쪽 끝에 사용해야합니다.
여기서 우리는 또한 사람과 Idcard를 사용하여 논의합니다. 사람은 고유 한 ID 카드에 해당하며 ID 카드는 사람을 독특하게 매핑하므로 양방향 협회 관계를 만듭니다. 사람의 주요 키는 또한 Idcard의 주요 키이며,이 키는 기본 키와 외국 키입니다. 이 연관성 관계는 양방향 일대일 매핑이되어 다음과 같이 관계 모델에서 표현 될 수 있습니다.
그림의 두 테이블은 1 차 키 연관성을 사용합니다. 사람의 주요 키는 IDCard의 주요 키이므로 Zhu 외국 키 사이의 제약 관계를 형성하고 고유성을 보장하고 객체 모델로 매핑하며 아래 그림과 같이 사람 클래스와 IDCard 클래스 간의 일대일 관계로 변환합니다.
이 일대일 관계는 이전 기사에서 <일대일> 태그가 사용 되었으며이 일대일 매핑은 양방향이므로 두 객체간에 동시에 <일대일>을 구성해야합니다. 먼저 IDCard에 해당하는 클래스 코드 및 매핑 파일 코드를 살펴 보겠습니다.
1. IDCARD에 해당하는 정보
idcard.java 클래스, IDCARD 클래스 및 개인 클래스 사이에는 일대일 관계가 있습니다. 따라서 해당 개인 속성을 IDCARD 클래스에 추가해야합니다. 이는 매핑 파일의 외래 키에 해당 속성을 추가하고 해당 외국 키 협회 클래스를 설정하는 것입니다.
패키지 com.src.hibernate; Public Class Idcard {// id 속성 개인 int id; public int getid () {return id; } public void setid (int id) {this.id = id; } // 카드 번호 속성 개인 문자열 cardno; 공개 문자열 getCardno () {return cardno; } public void setcardno (String Cardno) {this.cardno = cardno; } // 카드 번호 개인 개인에 해당하는 사람들; 공개인 getperson () {반품 사람; } public void setperson (사람) {this.person = person; }}idcard.hbm.xml 매핑 파일은 맵핑 파일에 외국 키 속성 사람을 추가하고 해당 <일대일> 태그를 추가합니다. 목적은 제약자 클래스가 일대일 매핑 관계를 달성하도록 강요하는 것입니다. 마지막으로, 강제 제약 관계를 보장하기 위해 매핑에서 제한된 속성을 true로 설정하십시오.
<? XML 버전 = "1.0"?> <! DocType Hibernate Mapping Public "-// hibernate/hibernate 매핑 DTD 3.0 // <hibernate-mapping> <class name = "com.src.hibernate.idcard"table = "idcard"> <id name = "id"type = "int"councm = "personId"> <generator> <property "> person </param> </generator> </id> <property name ="cardno ""string ""cardno "> cardno"> 제한된 = "true"> </일대일> </class> </hibernate-mapping>
2. 사람의 해당 정보
Person.java 클래스에서 기본 속성을 추가하는 것 외에도 해당 IDCARD 클래스는 일대일 양방향 협회 관계이므로 IDCARD 클래스를 개인 클래스에 추가해야합니다. 같은 이유는 개인 클래스 속성이 IDCard 클래스에 추가되기 때문입니다.
패키지 com.src.hibernate; 공개 클래스 사람 {// id 번호 개인 int id; public int getid () {return id; } public void setid (int id) {this.id = id; } // 이름 개인 문자열 이름; 공개 문자열 getName () {return name; } public void setName (문자열 이름) {this.name = 이름; } // idcard private idcard idcard; public idcard getIdcard () {return idcard; } public void setIdcard (idcard idcard) {this.idcard = idcard; }}person.hbm.xml 매핑 파일,이 파일의 주요 키 생성 전략은 IDCard 클래스에 의해 상호 제한되기 때문에 특별한 요구 사항이 없습니다. 주요 키와 외국 키는 모두 Idcard의 주요 키입니다. 또한 일대일 관계이므로 <일대일> 태그를 매핑 파일에 추가하여 표시해야합니다.
<? XML 버전 = "1.0"?> <! DocType Hibernate Mapping Public "-// hibernate/hibernate 매핑 DTD 3.0 // <hibernate-mapping> <class name = "com.src.hibernate.person"table = "person"> <id name = "id"indine = "ind"colmp = "personid"> <generator> </generator> </id> <property name = "name"column = "personame"> </prodition> <! 기본적으로 기본 키에 따라로드됩니다. 즉, 관계 필드의 값을 가져오고 상대방의 기본 키에 따라 관련 객체를로드합니다-> <일대일 이름 = "Idcard"> </one-to-one> </class> </hibernate-mapping>
3. 최대 절전 모드 매핑 파일
위의 클래스 및 매핑 파일이 구성되면 Hibernate.cfg.xml의 데이터베이스 매핑에 대한 정보는 Hibernate 구성 파일에 두 개의 구성 파일을 추가해야하므로 해당 데이터베이스를 생성 할 때 해당 생성 항목을 찾을 수 있습니다.
<? xml version = "1.0"alcoding = "utf-8"?> <! doctype hibernate-configuration public "-// Hibernate/Hibernate Configuration dtd 3.0 // en" "http://hiberceforge.net/hibernate-configuration-3.0.dtd"> <Section-Factory> <속성 이름 = "Hibernate.connection.driver_class"> com.mysql.jdbc.driver </property> <속성 이름 = "hibernate.connection.url"> jdbc : // localhost : 3306/hibernate_one2one_pk1 </property> <속성 이름 = "hibernate.connection.username"> root </property> <속성 이름 = "hibernate.connection.password"> 1234 </property> <property name = "hibernate.dialect"> org.hibernate.dialect.mysqldialect </production> <mapping resource = "com/src/hibernate/hibernate/perient/perient/perity Resource = "com/src/hibernate/idcard.hbm.xml"> </mapping> </session-factory> </hibernate-configuration>
4. 결과를 생성하십시오
구성이 완료되면 위의 내용에서 해당 데이터베이스를 생성 할 수 있습니다. 데이터베이스에서는 구성된 컨텐츠에 따라 해당 테이블 구조를 생성하며 테이블에는 해당 외래 키와 기본 키 필드가 있습니다. 테이블 구조를 생성 할 때 Hibernate는 다음과 같이 콘솔에서 해당 SQL 문을 출력합니다.
ALTER TABLE IDCARD DROP 외국 키 FK806F76ABAC038CD8 드롭 테이블 드롭 테이블이 존재하는 경우 IDCARD 드롭 테이블이 존재하는 경우 사람이 존재하는 경우 테이블 IDCARD (Perientid Integer NOLL NULL, CERDNO VARCHAR (255), 1 차 키 (PersonID)) 테이블 사람 (Personid Integer Nut Null Auto_increment, Personname varcent (255), PersonID (PersonID), PersonID (PersonID), Personname (255), FK806F76ABAC038CD8 (PersonID), 제약 조건 추가 FK806F76ABAC038CD8 외국 키 (PersonID) 참조 사람 (PersonID)
생성 된 테이블 구조는 그림과 같습니다.
PersonID 1 차 키는 두 테이블에서 동시에 생성되며 해당 외국 키이기도합니다. 또한 두 테이블의 기본 키를 동시에 제한하며 고유합니다.
5. 쓰기 및로드 테스트
테이블을 생성 한 후 테이블을 작성하고 테이블에서 데이터를 읽고 해당 테스트 클래스를 작성하고 테스트는 단위 테스트를 사용하고 해당 테스트 방법을 작성합니다.
5.1 쓰기 테스트
데이터베이스에 쓸 때, 작성된 두 개체는 해당 훈련 상태로 변환되어야한다는 점에 유의하십시오. 그렇지 않으면 상태 변환 오류가 발생합니다. 테스트 코드는 다음과 같습니다.
public void testsave1 () {세션 세션 = null; {// 세션 생성 객체 세션 = hibernateutils.getSession (); // 세션 트랜잭션 세션 활성화 .BegIntransaction (); // 사람 객체를 만들고 사람을 저장합니다. person = new Person (); person.setName ( "Zhangsan"); 세션 .Save (사람); // IDCARD 객체를 작성하고 IDCARD IDCARD를 저장 = 새 IDCARD (); idcard.setcardno ( "1111111111111"); idcard.setperson (사람); 세션 .SAVE (IDCARD); // 트랜잭션을 제출하고 데이터베이스 세션을 수정합니다 .getTransaction (). commit (); } catch (예외 e) {// 인쇄 오류 메시지 e.printstacktrace (); // 비즈니스 롤백 세션 .getTransaction (). Rollback (); } 마침내 {// 세션 hibernateutils.closesession (세션)을 닫습니다. }} 삽입 된 데이터는 다음과 같습니다.
5.2로드 테스트
로딩 방법을 작성하십시오. 연관 관계는 양방향이기 때문에 해당 하중 작업은 한쪽 끝을 통해 다른 쪽 끝을로드하여 해당 개인 클래스를 얻고 개인 클래스를 통해 해당 IDCARD 정보를 얻는 것이어야합니다. 그 반대도 사실이어야합니다. 코드는 다음과 같습니다.
public void testload1 () {세션 세션 = null; {// 세션 생성 객체 세션 = hibernateutils.getSession (); // 세션 트랜잭션 세션 활성화 .BegIntransaction (); // 사람 객체를 가져 와서 사람을 저장하고 person = (person) session.load (person.class, 5); System.out.println ( "idcard.id :"+person.getIdcard (). getId ()); System.out.println ( "idcard.cardno :"+person.getIdcard (). getCardNo ()); // IDCARD 객체를 작성하고 IDCARD IDCARD = (idcard) session.load (idcard.class, 5); System.out.println ( "person.id :"+idcard.getperson (). getId ()); System.out.println ( "person.name :"+idcard.getperson (). getName ()); // 트랜잭션을 제출하고 데이터베이스 세션을 수정합니다 .getTransaction (). commit (); } catch (예외 e) {// 인쇄 오류 메시지 e.printstacktrace (); // 비즈니스 롤백 세션 .getTransaction (). Rollback (); } 마침내 {// 세션 hibernateutils.closesession (세션)을 닫습니다. }} 위의 테스트 방법을 실행하고 다음과 같이 콘솔의 관련 내용을 인쇄하십시오.
2. 양방향 외국 키 관계
양방향 외국 키 협회는 외국 키 협회의 특별한 사례로 이해 될 수 있습니다. 이 전문 분야는 주로 양방향 서신이기 때문입니다. 이전 기사에서는 테이블에 외국 키 필드를 추가하려면 <verle-to-one> 태그를 사용할 수 있으며 관계 모델에서 해당 외부 키 열을 생성 할 수 있습니다. 양방향 외국 키 협회를 달성하려면이 태그를 사용해야합니다.
1. 객체 모델
먼저 객체 모델을 살펴 보겠습니다. 사람과 ID 카드는 일대일 관계입니다. 한 사람은 신원에 해당하므로 그들 사이의 멀티플렉스는 일대일 이며이 서신은 양방향입니다. 따라서 객체 모델은 아래 그림과 같이 양방향 기본 키와 동일합니다.
2. 관계형 모델
해당 관계 모델이 크게 변경됩니다. 일대일 외국 키 관계는 테이블에서 해당 외국 키를 생성합니다. 사람과 ID 카드를 받으면 관계 모델에 ID 카드 번호의 기본 키 열이 있으며 아래 그림과 같이 양방향 일대일 상황이 형성됩니다.
그들 사이의 대응은 위 그림에서 볼 수 있습니다. 사람 테이블에는 IDCARD 테이블의 주요 키가 있으며 일대일 외국 키 협회 관계를 형성하며 양방향입니다. 즉, IDCard는 사람을 통해 얻을 수 있으며 IDCARD를 통해도 얻을 수 있습니다.
Person Object의 코드 및 IDCard 객체는 이전 기사의 객체 코드와 동일합니다. 코드에 나열되어 있지 않습니다. 유일한 차이점은 매핑 파일의 구성 문제입니다.
3. 파일 매핑
idcard.hbm.xml 매핑 파일 IDCARD 테이블은 매핑의 주 테이블이 아니므로 일대일 매핑을 수행 할 때는 <일대일> 태그를 사용하여 구성해야하며 개인 관계 모델에서 외래 키 속성을 공식화해야합니다. 특정 코드는 다음과 같습니다.
<? XML 버전 = "1.0"?> <! DocType Hibernate Mapping Public "-// hibernate/hibernate 매핑 dtd 3.0 // <hibernate-mapping> <class name = "com.src.hibernate.idcard"table = "idcard"> <id name = "id"type = "int"> <generator /> < /id> <property name = "cardno"type = "java.lang.string"> <column name = "cardno" /> < /property> <one-one "" " property-ref = "idcard"> </일대일> </class> </hibernate-mapping>
person.hbm.xml 매핑 파일, 개인 테이블은 매핑의 기본 테이블입니다. IDCARD 테이블을 나타내려면 외부 키 속성 열을 테이블에 추가해야합니다. 따라서 <verlo-one> 태그는 여기에서 사람 객체에서 해당 외국 키를 생성하기 위해 여기에서 사용해야하며, 고유 한 항목은 고유 한 특성이 고유 한 것을 나타냅니다.
<? XML 버전 = "1.0"?> <! DocType Hibernate Mapping Public "-// hibernate/hibernate 매핑 dtd 3.0 // <hibernate-mapping> <class name = "com.src.hibernate.person"table = "person"> <id name = "id"indine = "ind"councm = "personId"> <generator /> < /id> <속성 이름 = "name"type = "java.lang.string"> <namex " /property> <idcard ="idcard = ""idcard = " Uniq
객체의 매핑 파일 구성이 완료되고 관계형 모델이 생성됩니다. SQL 문은 다음과 같습니다.
Alter Table Person 드롭 외국 키 FK8C768F55794A52CA 드롭 테이블이면 존재하는 경우 IDCARD 드롭 테이블이 존재하는 경우 사람이 존재하는 경우 테이블 IDCARD (ID INTEGER NOL NULL AUTO_INCREMENT, CardNO VARCHERMENT, CERDNO VARCHER (255), 1 차 키 (ID)) 테이블 사람 (PersonID Integer NOT NULL AUTO_INCREMENT, NOME NOR NORENT KEY) (PersonId)) Alter Table Person Add index fk8c768f55794a52ca (idcardno), 제약 조건 FK8C768F55794A52CA 외국 키 (IDCARDNO) 참조 IDCARD (ID)
생성 된 SQL 문은 우선 생성 된 모든 테이블입니다. 테이블을 만들 때 기본 키 열이 지정됩니다. 생성이 완료된 후, 두 테이블은 일대일 관계를 형성하기 위해 외국 키 속성을 지정하도록 수정됩니다.
테스트 방법을 작성하고, 단위 테스트를 채택하고, 두 클래스의 개체를로드하고, 객체의 한쪽 끝에서 각각 다른 객체를 얻습니다.
// IDCARD 객체를 사용하여 객체를로드하고 사람 객체를로드 public void testload1 () {세션 세션 = null; try {session = hibernateutils.getSession (); session.begintransaction (); // Idcard 객체를 가져 와서 Idcard Idcard idcard = (idcard) session.load (idcard.class, 1)의 객체와 고유하게 연관된 사람 객체를 얻습니다. System.out.println ( "person.id ="+idcard.getperson (). getId ()); System.out.println ( "idcard.person.name ="+idcard.getperson (). getName ()); // getperson 객체와 사람과 독특하게 연관된 Idcard 객체를 가져옵니다 System.out.println ( "idcard.id :"+person.getIdcard (). getId ()); System.out.println ( "idcard.cardno :"+person.getIdcard (). getCardNo ()); // commit transaction session.getTransaction (). commit (); } catch (예외 e) {e.printstacktrace (); session.getTransaction (). Rollback (); } 마침내 {hibernateutils.closesession (세션); }} 생성 된 콘텐츠 :
두 가지 매핑 관계를 비교하면 주요 키 및 외국 키 매핑 관계는 양방향 맵핑 관계이며 맵핑 관계는 객체의 양쪽 끝에서 동시에 구성해야합니다. 차이점은 기본 키는 속성 열을 생성 할 필요가 없기 때문에 <일대일>>을 사용하면되지만 외국 기본 키 생성 전략은 테이블의 기본 키에 사용되어야하며 외래 키 객체는 표시되어야한다는 것입니다. 외국 키 생성 전략은 <tole-to-one> 태그를 사용하여 새로운 외국 키 열을 생성해야합니다.
결론
양방향 협회의 일대일 매핑은 지금까지 논의되었습니다. 두 기사는 주로 양방향 협회의 두 가지 용도에 대해 논의합니다. 사실, 그것은 여전히 매우 간단합니다. 외국 키를 생성하려면 <verlo-one> 태그를 사용해야합니다. 고유 한 경우 고유 한 속성을 추가하십시오. <일대일> 태그는 일대일 관계를 나타냅니다. 하나의 객체가 다른 객체를로드하고 관계 모델에 새 열을 추가하지 않는 방법 만 나타냅니다. 다음 기사는 일대일 관계에 대해 논의 할 것입니다.