1. 상속 매핑
상속은 중요한 객체 지향 기능입니다. 코드 사용을 구현하고 관계 모델에서 상속 관계가 있습니다. 이 상속 관계는 실제로 열거 관계로 간주 될 수 있습니다. 많은 하위 유형은 유형에서 열거 될 수 있습니다. 이 하위 유형은 상속 관계를 형성합니다. 열거 될 수있는 대부분의 열거는 상속 맵으로 간주 될 수 있습니다. 따라서이 열거 관계는 상속 맵으로 간주 될 수 있습니다. 예를 들어, 동물은 다른 동물, 돼지, 고양이 등의 부모 계급 인 추상 계급이며, 아래 그림과 같이 상속 관계입니다.
이 상속 매핑은 관계형 모델로 변환 된 후 테이블을 생성합니다. 그렇다면이 테이블은이 두 가지 유형을 어떻게 구별합니까? 관계형 필드를 사용하려면 테이블에 유형 필드를 추가하고 키워드를 사용하여 객체의 유형을 나타냅니다. 따라서 위 그림의 객체 모델에 해당하는 테이블 구조는 다음과 같습니다.
테이블 구조를 생성 할 때 해당 필드 유형을 추가해야하므로 해당 맵 판별자를 매핑 파일에 추가해야합니다. 여기서는 판별기 값 속성을 사용해야합니다.
1. 클래스 파일
클래스 파일에주의를 기울일 필요가 없으며 글을 쓸 때 그들 사이의 상속 관계에주의를 기울이십시오.
목록 : 동물 수업 코드, 기본 속성 만 추가하면됩니다.
패키지 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 = 이름; } // 젠더 개인 부울 섹스; 공개 부울 issex () {return sex; } public void setsex (부울 섹스) {this.sex = 섹스; }}목록 2 : 새와 돼지 수업, 기본 특성을 추가하고 동물 수업을 상속합니다.
패키지 com.src.hibernate; 공개 클래스 조류는 동물을 확장합니다. {// 높이 개인 int 높이; public int getheight () {반환 높이; } public void setheight (int 높이) {this.height = 높이; }} 패키지 com.src.hibernate; 공공 계급 돼지는 동물 확장 동물 {// 체중 개인 int weight; public int getweight () {return weight; } public void setweight (int weight) {this.weight = weight; }} 2.지도 파일
해당 매핑을 매핑 파일에 추가해야합니다. 하나의 맵핑 파일 만 모델에 추가해야합니다. 하나의 테이블 만 생성되므로 해당 서브 클래스 매핑이 매핑 파일에 추가됩니다. <서브 클래스> 태그를 사용하면 구별기 값이 태그에 추가됩니다. 이 판별기 속성은 다음과 같이 데이터베이스에 데이터를 작성할 때 어떤 유형이 작성되는지를 나타냅니다.
<? XML 버전 = "1.0"?> <! DocType Hibernate Mapping Public "-// hibernate/hibernate 매핑 dtd 3.0 // 테이블 = "t_animal"> <id name = "id"> <generator // id> <!-인증 태그를 추가하고 ID에 배치해야합니다.> <Istriminator column = "type"/> <property name = "name"/> <property name = "sex"type = "boolean"/> <subclass name = "com.src.hibernate.pig"vistiminator "vvalue ="secclass name = "sex"type = "sex"type = 이름 = "무게"/> </subclass> <서브 클래스 이름 = "com.src.hibernate.bird"Distriminator-value = "b"> <속성 이름 = "height"/> </subclass> </class> </hibernate-mapping>
3. 분석 결과
생성 된 MySQL 데이터베이스 테이블은 동물의 기본 속성을 추가 할뿐만 아니라 돼지와 새의 특성을 추가합니다. 추가 된 속성은 매핑 파일에 <서브 클래스>를 사용하여 작성되므로 해당 판별 자 속성도 추가되므로 해당 판별 기 열이 데이터베이스에 추가됩니다. 생성 된 테이블 구조는 다음과 같습니다.
2. 데이터 작동
1. 데이터를 작성하십시오
데이터 읽기 및 쓰기 작업을 수행 할 때는 수업에서 운영 사용에주의를 기울여야합니다.
public void testsave () {세션 세션 = null; 시도 {// 세션 생성 객체 세션 = hibernateutils.getSession (); // 트랜잭션 열기 세션 .BegIntransaction (); 돼지 돼지 = 새로운 돼지 (); Pig.SetName ( "작은 돼지"); Pig.setSex (true); Pig.setweight (200); 세션 .save (돼지); 새 새 = 새로운 새 (); bird.setName ( "Xiaoniao"); bird.setsex (true); Bird.Setheight (100); 세션 .Save (새); session.getTransaction (). commit (); } catch (예외 e) {e.printstacktrace (); session.getTransaction (). Rollback (); } 마침내 {hibernateutils.closesession (세션); }}2. 다형성 쿼리-get 및 HQL
기본 쿼리 방법은로드 및 GET 메소드 만 사용하면됩니다. 여기서 우리는 다형성 쿼리에 중점을 둡니다. 다형성 쿼리는 최대 절전 모드를 인스턴스를 사용하여 객체를로드 할 때 실제 객체 유형을 식별하여 다형성 쿼리가 될 수 있음을 의미합니다.
참고 : 다형성 쿼리는 게으른로드를 지원하지 않습니다. 즉,로드 방법을 사용하는 경우 매핑 파일에서 게으른 하중을 False로 설정해야합니다.
3. 하중 지연 로딩
부하는 게으른 하중을 지원합니다. 객체를로드 할 때는 실제로 객체의 프록시를 생성합니다. 따라서 다형성 쿼리를 사용할 때는 다음과 같이 매핑 파일에서 게으른로드를 False로 설정해야합니다.
<? XML 버전 = "1.0"?> <! DocType Hibernate Mapping Public "-// hibernate/hibernate 매핑 dtd 3.0 // 테이블 = "t_animal"lazy = "false"> <id name = "id"> <generator // id> <!-인증 태그를 추가하고 ID에 배치해야합니다.> <eptiminator column = "type"/<property name = "name"/> <속성 이름 = "sex"type = "boolean"/> <서브 클래스 이름 = "com.src.hibernate.pig" 판별 자-값 = "p"> <속성 이름 = "weight"/> </subclass> <subclass name = "com.src.hibernate.bird"Destriminator-value = "b"> <property name = "height"/</subclass> </class> </hibernate-mapping>
로드로드 방법으로로드로로드를 사용 하여이 예제는 다형성 쿼리를 지원하고 구성 파일에서 지연된로드를 False로 설정하므로로드 방법을 사용하여 해당 객체 클래스를로드하고 얻을 수 있습니다.
public void testload () {세션 세션 = null; try {session = hibernateutils.getSession (); session.begintransaction (); 동물 ani = (동물) 세션 .LOAD (Animal.Class, 1); System.out.println (ani.getName ()); // 부하가 기본적으로 게으른 것을 지원하기 때문에 동물의 대리인을 볼 수 있으므로 // 인스턴스는 진정한 유형 돼지를 식별 할 수 없으므로 부하 가이 경우 (ani instanceof pig) {System.out.println ( "I am a in pig!"); } else {System.out.println ( "나는 돼지가 아니야!"); } session.getTransaction (). commit (); } catch (예외 e) {e.printstacktrace (); session.getTransaction (). Rollback (); } 마침내 {hibernateutils.closesession (세션); }} 4.HQL 쿼리
HQL은 다형성 쿼리를 지원합니다. 주로 쿼리가 실제 객체이며 프록시를 반환하지 않기 때문입니다. 따라서 HQL은 다형성 쿼리를 지원합니다. 또한 쿼리시 쿼리 문에서 테이블 이름을 사용하지 않고 클래스 이름을 사용하는 데주의를 기울여야합니다. Hibernate는 다음과 같이 클래스 이름에 따라 해당 테이블 이름에 매핑됩니다.
public void testload5 () {세션 세션 = null; try {session = hibernateutils.getSession (); session.begintransaction (); list <emale> list = session.createquery ( "From Animal"). list (); for (iterator iter = list.iterator (); iter.hasnext ();) {동물 a = (동물) iter.next (); if (돼지 인스턴스) {System.out.println ( "나는 돼지!"); } else {System.out.println ( "나는 돼지가 아니야!"); }} session.getTransaction (). commit (); } catch (예외 e) {e.printstacktrace (); session.getTransaction (). Rollback (); } 마침내 {hibernateutils.closesession (세션); }}쿼리 결과 :
Hibernate : Animal0_.id as Id0_, Animal0_.Name As Name0_, Animal0_.sex As Sex0_, animal0_.weight as weight0_, avingle0_. Height0_, type0_. type as t_animal Animal0_ I 나는 돼지가 아니야! 나는 돼지입니다! 나는 돼지가 아니야!
3. 상속 매핑을위한 세 가지 전략
1. 클래스 계층 당 테이블
인터페이스 결제 및 여러 구현 클래스와 같은 신용 관리, 현금 납세 및 ChequePayment가 있다고 가정합니다. 그런 다음 "클래스 계층 당 테이블"의 매핑 코드는 다음과 같습니다.
<class name = "payment"table = "payment"> id name = "id"indap column = "cctype"/> ... </subclass> <subclass name = "CashPayment"Distriminator-value = "Cash"> ... </subclass> <subclass name = "chequepayment"Distriminator-value = "check"> ... </subclass> </class
이 전략을 채택하려면 하나의 테이블 만 필요합니다. 큰 제한 사항이 있습니다. CCType와 같은 서브 클래스로 정의 된 필드는 널이 아닌 제약 조건을 가질 수 없어야합니다.
2. 서브 클래스 당 하나의 테이블
위의 예제의 클래스의 경우 "서브 클래스 당 하나의 테이블"의 매핑 전략이 채택되고 코드는 다음과 같습니다.
<class name = "payment"table = "payment"> id name = "id"type = "long"column = "payment_id"> <generator/> </id> <속성 이름 = "aut 이름 = "CashPayment"table = "Cash_Payment"> <key column = "payment_id"/> <property name = "CreditCardType"column = "cctype"/> ... </join-subclass> <j
4 개의 테이블이 필요합니다. 3 개의 서브 클래스 테이블은 기본 키를 통해 슈퍼 클래스 테이블과 관련이 있습니다 (따라서 관계 모델은 실제로 일대일 연관성입니다).
3. 각 서브 클래스에는 테이블 (서브 클래스 당 테이블)이 있으며 판별자를 사용합니다.
"서브 클래스 당 하나의 테이블"의 매핑 전략의 경우, 최대 절전 모드 구현에는 판별 자 필드가 필요하지 않으며, 다른 객체/관계형 매핑 도구는 슈퍼 클래스 테이블의 유형 구별기 열이 필요합니다. 최대 절전 모드에 의해 채택 된 방법은 구현하기가 더 어렵지만 관계 (데이터베이스)의 관점에서 더 정확합니다. 분별 필드와 함께 "서브 클래스 당 하나의 테이블"전략을 기꺼이 사용하려는 경우 다음과 같이 <Chinclass>와 함께 <서브 클래스>를 사용할 수 있습니다.
<class name = "지불"테이블 = "지불"> id 이름 = "id"indap <property name = "creditcardtype"column = "cctype"/> ... </join> </subclass> <서브 클래스 이름 = "CashPayment"Destriminator-value = "Cash"> <join table = "cash_payment"> ... </conce> </subclass> <subclass name = "chequepay" "value"> value = wit. table = "cheque_payment"fetch = "select"> ... </join> </subclass> </class> </class>
선택적 선언 Fetch = "Select"는 슈퍼 클래스를 쿼리 할 때 외부 조인을 사용하여 서브 클래스 ChequePayment의 데이터를 가져 오지 않는다는 것을 Hibernate에게 알려줍니다.