최대 절전 모드는 분류 및 통합을 수행했으며 최대 절전 모드는 실제로 핵심 물체, 매핑 및 HQL의 세 부분으로 나뉘어져 있음을 발견했습니다. 이 세 부분은 개발 과정에서 가장 일반적으로 사용됩니다. 이전 기사는 핵심 객체와 객체 간의 변환 방법에 대해 논의합니다. 다음으로, 최대 절전 모드의 매핑 사용 방법에 대해 논의하십시오.
최대 절전 모드의 중요한 기능은 객체 모델과 관계형 모델 사이를 변환 할 수있는 매핑입니다. 객체 지향 프로그래밍 아이디어를 옹호합니다. 매핑 프로그램을 사용하는 개발자는 객체 모델의 코드 작성에만 관심을 가질 만하면됩니다. 객체와 관계형 데이터베이스 사이의 매핑은 일반적으로 XML 문서로 정의됩니다. 이 매핑 문서는 읽을 수 있도록 설계되었으며 수동으로 수정할 수 있습니다. 다음 그림과 같이이 매핑 관계를 요약합니다.
매핑은 XML을 통해 정의되며 Hibernate가 생성 한 세션을 사용하여 관리하고 세션은 JTA를 사용하여 데이터베이스에 변경 사항을 제출합니다. 세션은 지속성 층의 개체를 관리하는 지속성 관리자로 이해 될 수 있습니다. SessionFactory에 의해 만들어집니다. 최대 절전 모드로 프로그래밍 할 때는 먼저 데이터베이스에 연결해야하므로 먼저 XML에서 데이터베이스 연결 구성을 확인하고 문서 구성 (데이터베이스 미러로 이해 될 수 있음)에 따라 세션 변형을 작성 한 다음 세션 변형을 만듭니다. 마지막으로, 세션은 변경 사항을 데이터베이스에 균일하게 제출하여 모든 작업을 완료합니다.
사용 과정
1. 매핑 파일을 만들면 매핑 파일에 .hbm.xml이 접미사되어 최대 절전 모드 매핑 파일임을 나타냅니다.
2. 매핑 파일에 엔티티 클래스를 등록하고 엔티티 클래스의 속성을 매핑 클래스에 추가하십시오. 속성을 추가 할 때는 ID와 속성의 두 가지 값을 지정해야합니다. ID는 엔티티의 유일한 식별자임을 나타내며, 속성은 테이블의 필드 열임을 나타냅니다.
3. 수정을 제출하고 데이터를 동기화하십시오.
참고 : 데이터베이스에 XML 데이터를 개발 한 개발자는 곧이 매핑이 실제로 배치 업데이트 및 배치 생성 프로세스이며 매핑도 예외는 아닙니다. 최대 절전 모드는 표준에 따라 변환 할 수있는 매핑 표준 세트를 규정합니다. 내부 구현은 여전히 죽었으므로 비교적 유연하고 사용하기 쉽습니다.
간단한 엔티티 클래스 매핑 프로세스 :
1. 속성 코드의 엔티티 클래스 사용자 1 :
패키지 com.hibernate; import java.util.date; 공개 클래스 사용자 1 {개인 문자열 ID; 개인 문자열 이름; 개인 문자열 비밀번호; 개인 날짜 CreateTime; 사적 날짜 초기; public String getId () {return id; } public String getName () {return name; } public void setName (문자열 이름) {this.name = 이름; } public String getPassword () {return password; } public void setpassword (문자열 비밀번호) {this.password = password; } 공개 날짜 getCreateTime () {return createTime; } public void setCreateTime (Date CreateTime) {this.createTime = createTime; } 공개 날짜 getExpiretime () {return expiretime; } public void setExpiretime (날짜 expiretime) {this.expiretime = expiretime; }}
2. Mapping File user1.java의 user1.hbm.xml의 내부 코드 구현 : Java :
기본 데이터베이스에서 설정할 수있는 설정은 최대 절전 모드로 제공됩니다. 레이블 속성을 사용하여 특정 매핑 관계를 설정할 수 있습니다.
클래스-> 테이블 클래스 태그, 일반적으로 사용되는 속성을 사용합니다.
(1) 이름 :지도 엔티티 클래스, 그 값은 테이블로 변환 해야하는 엔티티 클래스의 이름으로 설정해야합니다. 동기화 중에 해당 엔티티 클래스는이 속성에 따라 발견됩니다.
(2) 표 : 데이터베이스 테이블의 이름을 매핑하십시오. 매핑 될 테이블의 이름이 엔티티 클래스 이름과 다른 경우이 속성을 사용하여 매핑 된 테이블을 지정하십시오. 존재하지 않으면 테이블은 속성의 값에 따라 작성됩니다.
아래 그림과 같이 위 그림의 구성에 의해 생성 된 테이블 구조를 확인하십시오.
테이블 이름은 t_user1로 변경됩니다. ID 필드는 user_id로 변경되고 필드 길이는 32 비트입니다. CreateTime 속성은 데이터베이스 필드 Create_Time에 매핑되며 현재까지 수정됩니다.
속성 -> 필드는 ID 또는 속성 태그, 일반적으로 사용되는 속성을 사용합니다.
(1) 이름 : 함수는 클래스 태그의 이름과 유사하며 값은 엔티티 클래스의 매핑 속성 이름을 결정합니다.
(2) 열 : 맵핑 테이블의 열 이름을 지정하는 엔티티 클래스 태그의 표와 유사하며 존재하지 않으면 생성됩니다.
(3) 유형 : 데이터베이스의 필드에 매핑 된 데이터 유형을 지정하고 필요에 따라 문서를 봅니다.
(4) 선택 사항 인 생성기는 지속적인 클래스에 대한 고유 식별자를 생성하는 데 사용됩니다.
<id name = "id"type = "long"column = "cat_id"> <generator> <param name = "table"> uid_table </param> <param name = "column"> next_hi_value_column </param> </generator> </id>
모든 생성기는 org.hibernate.id.identifiergenerator 인터페이스를 구현합니다. 이것은 매우 간단한 인터페이스입니다. 일부 응용 프로그램은 자체 구현을 제공하도록 선택할 수 있습니다. 물론 Hibernate는 많은 내장 구현을 제공합니다. 일반적으로 사용되는 몇 가지 유형은 다음과 같습니다.
(1) 신원 : 반환 된 식별자는 길고 짧거나 int입니다. 데이터베이스의 자체 증가 필드와 유사합니다.
(2) 시퀀스 : DB2, PostgreSQL, Oracle, SAP DB, McKOI 및 인터베이스의 발전기에서 시퀀스를 사용합니다. 반환 된 식별자는 길고 짧거나 int입니다. 전체 데이터베이스에서 단일 테이블에서 자체 증가하는 대신 단일 테이블에서 자체 증가를 추가해야 함을 지정해야합니다.
(3) UUID : 128 비트 UUID 알고리즘을 사용하여 네트워크에서 고유 한 문자열 유형 식별자를 생성합니다 (IP 주소 사용). UUID는 32 비트 16 진수의 문자열로 인코딩됩니다. .NET에 의해 생성 된 일련 번호와 유사합니다.
(4) 기본 : 기본 데이터베이스의 기능에 따라 신원, 시퀀스 또는 힐로 중 하나를 선택하십시오. 유연한 방식으로 사용 된 데이터베이스에 따라 사용 된 ID 유형은 사용됩니다. MySQL은 ID를 선택하고 Oracle은 시퀀스를 선택합니다.
(5) 할당 : 엔티티 클래스에 대한 식별 ID를 수동으로 만듭니다. <generator> 요소가 지정되지 않은 경우 기본 생성 정책입니다.
(6) 외국 : 다른 관련 객체 식별자를 사용하십시오. 일반적으로 <일대일>과 함께 사용됩니다.
개발자는 종종 설명서 지침에 따라 구성 속성을 작성하기 위해 수동 구성 방법에 사용됩니다. 이것은 매우 원시적입니다. 초보자는 수동 구성 방법을 사용하여 사고에 도움이되는 것이 좋습니다. 시각적 방법을 사용하여 XML 구성 문서를 구성하고 생성하여 개발 효율성을 향상시키는 많은 타사 도구가 있습니다. Xdoclet, Middlegen 및 Andormda와 같은 유사한 도구.
연관 매핑은 많은 것입니다
최대 절전 모드의 기본 매핑은 위에서 설명합니다. 엔티티 클래스는 테이블에 해당하며 해당 최대 절전 모드 매핑 파일의 <class> 태그 매핑을 사용합니다. 엔티티 클래스의 일반 속성은 테이블 필드에 해당하며 <posperation> 태그를 사용하여 매핑됩니다. 또한 엔티티 클래스를 구성 할 때는 다음에주의를 기울여야합니다. 매개 변수가없는 기본 생성자는 엔티티 클래스에서 구현해야하며 레이블을 제공해야합니다. 엔티티 클래스를 수정하고 엔티티 클래스에 대한 getter 및 setter 메소드를 생성하기 위해 Final을 사용하지 않는 것이 좋습니다. 마지막으로, 몇 가지 주요 주요 주요 생성 전략이 소개되고 다음 단계는 다중 매핑에 대해 논의하는 것입니다.
이 다중 상관 관계 매핑은 객체 모델에 반영됩니다. 그것은 집계 관계입니다. 사용자는 그룹의 일부입니다. 그룹에는 사용자가 있습니다. 그들의 수명주기는 다르며 다음 그림에 반영 될 수 있습니다.
그렇다면이 다중 관계 매핑은 최대 절전 모드에서 어떻게 설정되어 있습니까? 다음은 두 가지 방법을 소개합니다. <verlo-one> 태그를 사용하여 직접 매핑하거나 <tole-to-one> 캐스케이드를 사용하여 테이블을 수정하십시오.
1. 다 직접 매핑 <br /> 문자 그대로의 의미에서 이해 될 수 있습니다. 많은 사람들은 더 많은 끝을 말하고, 하나는 더 적은 끝을 말합니다. 그것을 사용할 때, 태그는 종종 More End의 HBM에서 사용되며 <volto-one>의 이름 속성은 다음과 같은 매핑 파일의 해당 클래스에서 한쪽 끝의 속성으로 설정됩니다. 이 태그는 user.hbm.xml에 추가되며 많은 사람들에게 해당합니다. 태그의 이름 값은 하나를 매핑하는 그룹이며 user.java에 Group이라는 속성이 있습니다. 다음으로 구현을 구현하는 특정 코드 클래스를 살펴 보겠습니다.
(1) user.java 클래스 코드는 그룹이라는 속성을 가지고 있으며, <holl-to-one>의 한쪽 끝의 이름 값으로 사용됩니다.
공개 클래스 사용자 {개인 문자열 이름; 공개 문자열 getName () {return name; } public void setName (문자열 이름) {this.name = 이름; } 개인 그룹 그룹; 공개 그룹 GetGroup () {반환 그룹; } public void setGroup (Group Group) {this.group = Group; }}(2) user.hbm.xml에서 <voll-to-one>의 이름 값은 user.java의 한 쪽의 속성 값입니다. 데이터베이스에서 새 열을 생성하며 사용자 테이블의 외래 키로 이해할 수 있습니다.
<? XML 버전 = "1.0"?> <! DocType Hibernate Mapping Public "-// Hibernate/Hibernate 매핑 DTD 3.0 // <hibernate-mapping> <class name = "com.hibernate.user"table = "user"> <id name = "id"type = "java.lang.lang"> <column name = "id" /> <generator /> < /id> <!-이름의 값은 user.java의 해당 속성입니다. 테이블에서 열을 자동으로 생성하므로 열에 열이 열을 사용하여 이름이 변경됩니다 .-> <ulto-one name = "group"column = "groupId"> </hibernate> </hibernate-mapping>
(3) 위의 매핑 관계를 테스트하고, 두 개의 사용자 객체를 테이블에 쓰고, us user1 및 user2를 지정하고, Zhang San 및 Li Si를 지정하고, 객체를 저장하고, 데이터베이스에 데이터를 작성하십시오. 코드는 다음과 같습니다.
public void testsave1 () {세션 세션 = null; {session = getsession.getSession (); session.begintransaction (); 그룹 그룹 = 새로운 그룹 (); group.setName ( "파워 노드"); 사용자 user1 = 새 사용자 (); user1.setName ( "Zhang San"); user1.setgroup (그룹); user user2 = 새 사용자 (); user2.setname ( "li si"); user2.setgroup (그룹); 세션 .SAVE (user1); 세션 .SAVE (user2); // transientObjectException 오류 가보고됩니다. // 캐시를 청소할 때 오류가 발생합니다. 과도기과 TransientObjectException // 그룹이 과도 상태이기 때문에 세션이없고 데이터베이스에 일치하는 데이터가 없기 때문에 // 사용자가 지속적 상태 일 때, 동 최대 절전균은 캐시에서 그룹 객체를 찾을 수 없습니다. session.getTransaction (). commit (); } catch (예외 e) {e.printstacktrace (); session.getTransaction (). Rollback (); } 마침내 {getsession.closesession (세션); }}그러나 위의 코드를 사용할 때는 쓰기를 실행할 때 과도 요법 외환이보고됩니다. 이는 사용자 객체를 저장할 때 <anto-to-one>에 추가 된 그룹에 따라 메모리의 그룹 객체를 검색하기 때문입니다. 그러나 위 코드에서 그룹 객체는 항상 과도 상태에 있으며 세션에서 관리하지 않으므로 세션 객체를 찾을 수없고 사용자 객체가 영구 상태로 들어가 므로이 오류 가보고됩니다. 올바른 코드는 다음과 같습니다.
public void testsave2 () {세션 세션 = null; {session = getsession.getSession (); session.begintransaction (); 그룹 그룹 = 새로운 그룹 (); group.setName ( "파워 노드"); 세션 .save (그룹); // 여기에서 그룹 객체를 영구 객체로 설정하십시오. 사용자 1 = new User (); user1.setName ( "Zhang San"); user1.setgroup (그룹); user user2 = 새 사용자 (); user2.setname ( "li si"); user2.setgroup (그룹); 세션 .SAVE (user1); 세션 .SAVE (user2); // 데이터를 올바르게 저장할 수 있습니다. // 그룹과 사용자는 영구 상태의 개체이기 때문에 // hibernate가 캐시 세션을 정리할 때 세션에서 관련 객체를 찾을 수 있습니다. } catch (예외 e) {e.printstacktrace (); session.getTransaction (). Rollback (); } 마침내 {getsession.closesession (세션); }} 2. 계단식 매핑
그룹 객체와 사용자 객체를 위에서 언급 한 지속적인 객체로 변환하는 것 외에도 캐스케이드 캐스케이드 매핑 속성을 사용하고 <verle-to-one> 속성에 캐스케이드 속성을 추가 한 다음 저장 업데이트에 복사 할 수 있습니다. 그룹 객체가 영구 상태에 있지 않은 경우 데이터베이스에 쓸 수 있습니다. 이러한 방식으로, 두 사용자 객체의 그룹 속성을 동일한 그룹 객체로 설정하여 다중 매핑 관계를 달성하면됩니다. 현재 user.hbm.xml의 해당 콘텐츠는 다음 코드입니다.
<? XML 버전 = "1.0"?> <! DocType Hibernate Mapping Public "-// Hibernate/Hibernate 매핑 DTD 3.0 // <hibernate-mapping> <class name = "com.hibernate.user"table = "user"> <id name = "id"type = "java.lang.lang"> <column name = "id"/> <generator/> </id> <!-캐스케이드 수정 테이블-> <hold-to-one name = "column ="cascade = "> </mover-on-on"> </hibernate-mapping>
참고 : 캐스케이드를 저장으로 설정 한 후에는 캐스케이드 수정, 추가 및 데이터베이스 삭제 일 수 있지만 특정 캐스케이드 쿼리 작업을 수행 할 수 없습니다.
해당 테스트 구성 파일 방법은 다음과 같습니다.
// 캐스케이드 캐스케이드 public void testsave3 () {세션 세션 = null; {session = getsession.getSession (); session.begintransaction (); 그룹 그룹 = 새로운 그룹 (); group.setName ( "파워 노드"); 사용자 user1 = 새 사용자 (); user1.setName ( "Zhang San"); user1.setgroup (그룹); user user2 = 새 사용자 (); user2.setname ( "li si"); user2.setgroup (그룹); 세션 .SAVE (user1); 세션 .SAVE (user2); // cascade가 사용되기 때문에 transientObjectException이 던져지지 않았습니다. // hibernate는 먼저 사용자의 관련 객체 그룹을 저장합니다. // 그룹 및 사용자는 영구 상태 세션에서 객체입니다. } catch (예외 e) {e.printstacktrace (); session.getTransaction (). Rollback (); } 마침내 {getsession.closesession (세션); }} 3. 비교 승화
두 가지 방법은 또한 다중 매핑 방법을 구현하며 결과는 동일하지만 구현에서는 매우 다릅니다. 첫 번째 또는 두 번째 유형이 <verlo-one>을 사용하여 여러 쪽 끝의 매핑 파일에 태그를 추가하고 매핑 파일에 의해 등록 된 클래스의 한쪽 끝의 속성 값에 태그의 이름 속성을 할당하므로 동일합니다. 차이점은 직접 매핑 관계가 최대 절전 모드의 속성을 사용하지 않는다는 것입니다. 추가, 삭제 및 수정을 지원할뿐만 아니라 쿼리도 허용합니다. 두 번째 캐스케이드 캐스케이드 수정은 최대 절전 모드가 제공하는 방법을 채택합니다. 이 방법은 첨가, 삭제 및 수정 만 지원하며 쿼리를 지원하지 않습니다.