복합 기본 키 매핑은 매핑 구성 파일에서 <composite-id> 태그를 사용해야합니다. 이 태그는 클래스를 해당 화합물 1 차 키로 지정하는 것을 말합니다. 이름 속성은 클래스 파일에 정의 된 속성 값을 지정하고 <key-property> 하위 라벨을 태그에 추가해야합니다.
참고 : 복합 매핑을 사용하려면 복합 기본 키를 한 클래스에 배치해야합니다. 즉, 복합 기본 키 속성 및 기타 속성은 두 클래스로 나뉘어 있으며 Composite 기본 키 클래스는 java.io에 속하는 인터페이스 시리얼이즈가 가능합니다.
복합 기본 키의 매핑 관계의 기본 키는 여러 열로 구성되며, 아래 그림과 같이 데이터 테이블에 매우 간단합니다.
1. 클래스 파일
여기서 우리는 위 그림의 표를 예로 들어갑니다. 표에서 두 개의 필드와 기간이 결합되어 테이블의 주요 키를 형성합니다. 따라서, 새로운 클래스는 각각 fiscalyearperiod 및 fiscalyearperiodpk로 명명되었습니다. 그중에서도 FISCALYEARIOD 클래스는 테이블의 주요 주요 속성을 캡슐화하고, FISCALYPERIOD 클래스는 다른 속성을 캡슐화하고 FISCALYEARIED 클래스를 캡슐화합니다.
1.1 FISCALYEARPERIOD.java
이 클래스는 기본 속성을 캡슐화하고 FISCALYPERIODPK 클래스를 클래스의 속성으로 캡슐화하고 다음과 같이 구성 파일의 해당 매핑을 구성합니다.
패키지 com.src.hibernate; java.sql.date 가져 오기; 공개 클래스 viscalyearperiod {// 시간 1 차 주요 개인 fiscalyeariodpk fiscaleearperiodpk; public fiscalyearperiodpk getFiscalyEarPerioDPK () {return QuicCyAerPerioDPK; } public void setfiscalyearperiodpk (fiscalyearperiodpk fiscalyearperiodpk) {this.fiscalyearperiodpk = QuiclyPeriodpk; } // 시작 날짜 시작 개인 날짜 시작; 공개 날짜 getBegindate () {return barkinate; } public void setBegindate (날짜 시작) {this.begindate = barindate; } // 종료 날짜 개인 날짜 종료; 공개 날짜 getendDate () {return endDate; } public void setendDate (date endDate) {this.endDate = endDate; } // 스테이지 시간 개인 문자열 기간; 공개 문자열 getperiodsts () {return regeersts; } public void setperiodsts (String evereasts) {this.periodsts = periodsts; }} 1.2 FISCALYEARPERIODPK.java
기본 키 속성을 캡슐화하십시오. 이 클래스는 FISCALYEARPERIOD 클래스와 분리되어 있습니다. 기본 기본 키 속성이 포함되어 있으며 인터페이스 직렬화 가능한 인터페이스를 구현해야합니다. 이 클래스는 클래스를 지정하기 위해 구성 파일의 <composite-id> 태그에 매핑되어야합니다. 코드는 다음과 같습니다.
패키지 com.src.hibernate; java.io.serializable import; 공개 클래스 fiscalyearperiodpk는 직렬화 가능한 {// private int fiscaleear; public int getfiscalyear () {return fiscalyear; } public void setfiscalyear (int fiscalyear) {this.fiscalyear = fiscalyear; } // 기간 개인 int jecalperiod; public int getFiscalPeriod () {return fiscalperiod; } public void setfiscalperiod (int fiscalperiod) {this.fiscalperiod = FISCALPERIOD; }} 2. 구성 파일
다음은 두 클래스 중 매핑 파일을 추가 해야하는 질문이 있습니까? <composite-id> 태그가 사용되므로 FISCALYEARIED 클래스에 대한 매핑 만 추가하면 해당 복합 기본 키 태그를 매핑 파일에 추가하고 다음과 같이 해당 기본 키 속성을 태그에 추가하십시오.
<? XML 버전 = "1.0"?> <! DocType Hibernate Mapping Public "-// Hibernate/Hibernate 매핑 DTD 3.0 // 테이블 = "t_fiscal_year_period_pk"> <composite-id name = "quiscaleearpk"> <key-property name = "refiscaleear"> </key-property> <key-property name = "fiscalperiod"> </key-property> </composite-id> type = "date"/> <property name = "endDate"type = "date"/> <property name = "periodsts"/> </class> </hibernate-mapping>
위의 파일은 해당 데이터베이스 테이블을 생성하기 위해 생성되며 생성 된 SQL 문은 다음과 같습니다.
드롭 테이블이 존재하는 경우 t_fiscal_year_period_pk 테이블 생성 테이블 t_fiscal_year_period_pk (fiscalyear inger not null, fiscalperiod integer, begindate date, enddate 날짜, 기간 Varchar (255), 1 차 키 (FISCALYEAR, FISCALPERIOD))
해당 테이블 구조는 다음과 같습니다.
3. 데이터 작동
해당 매핑 파일이 구성되면 해당 데이터 작업이 매우 간단 해집니다. 먼저 데이터 작성부터 시작하십시오. 데이터베이스에 데이터를 작성할 때는 두 클래스가 동시에 데이터베이스에 기록됩니다. 따라서 두 클래스 모두 일시적 상태로 변환되어야합니다. 따라서 저장시 먼저 FISCALYPERIOD 객체를 데이터베이스에 저장 한 다음 복합 속성을 자동으로 연결하고 정보를 데이터베이스에 저장해야합니다.
3.1 쓰기 작업
쓰기 작동 방법은 이전 쓰기 방법과 동일합니다. 두 객체를 정의한 다음 해당 객체 정보를 데이터베이스에 저장해야합니다. 코드는 다음과 같습니다.
public void testsave1 () {// 세션 객체 세션 세션 = null; {// 세션 객체 세션을 얻습니다. hibernateutils.getSession (); // 세션 세션을 엽니 다. beginTransaction (); // 복합 객체 생성 QuiclyPeriodpk fiscalyearperiodpk = new fiscalyearperiodpk (); FISCALYEARPERIODPK.SETFISCALPERIOD (2014); FISCALYEARPERIODPK.SETFISCALEYEARYEAR (2012); // 객체 생성 fiscalyearPeriod fiscalyearperiod = new fiscalyearperiod (); FISCALYEARPERIOD.SETFISCALYEARPERIODPK (FISCALYEARPERIODPK); 세션 .SAVE (FISCALYEARPERIOD); // 세션 세션 제출 세션 .getTransaction (). commit (); } catch (예외 e) {e.printstacktrace (); session.getTransaction (). Rollback (); } 마침내 {hibernateutils.closesession (세션); }}해당 테스트 방법을 실행하면 생성 된 SQL 문은 다음과 같습니다.
Hibernate: insert into t_fiscal_year_period_pk (beginDate, endDate, periodSts, fiscalYear, fiscalPeriod) values (?, ?, ?, ?, ?) 해당 데이터베이스보기 :
3.2로드 작업
테이블의 기본 키는 복합 속성이므로 클래스를 생성해야하기 때문에 해당 하중 방법은 이전과 다릅니다. 데이터를로드 할 때는 기본 키 객체를 작성해야합니다. 현재 기본 키는 객체이며 객체를 얻으려면 객체의 속성에 값을 할당해야합니다. 코드는 다음과 같습니다.
public void testload1 () {// 세션 객체 세션 세션 = null을 선언합니다. {// 세션 객체 세션을 얻습니다. hibernateutils.getSession (); // 세션 세션을 엽니 다. beginTransaction (); // 복합 객체 생성 QuiclyPeriodpk fiscalyearperiodpk = new fiscalyearperiodpk (); FISCALYEARPERIODPK.SETFISCALPERIOD (2014); FISCALYEARPERIODPK.SETFISCALYEAR (2012); FISCALYEARPERIOD FISCILAYEARPERIOD = (FISCALYPERIOD) SESSION.LOAD (FISCALYEARPERIOD.CLASS, FISCALYPERIODPK); System.out.println ( "시작 날짜 :"+fiscalyearperiod.getBegindate ()); // 세션 제출 세션 .getTransaction (). commit (); } catch (예외 e) {e.printstacktrace (); session.getTransaction (). Rollback (); } 마침내 {hibernateutils.closesession (세션); }}결과는 다음과 같습니다.
Hibernate : Fiscalpe2_0_0_, FISCALPERIOD AS FISCALYEAR0_.FISCALYEAR를 선택하여 FISCALPE2_0_0_, FISCALYEAR0_.BEGINDATE는 endDate0_0_, FISCALE0_0_, FISCALE0_0_, FISCALY0_.ENDDATE AS as THER DETEDSTS0_. t_fiscal_year_period_pk fiscalyear0_ 여기서 fiscalyear0_.fiscalyear =? 그리고 quiscaleear0_.fiscalperiod =? 시작 날짜 : 2013-10-12
4. 포괄적 인 예
대기업 (Hibernate_dept_compositepk)의 부서 테이블은 지역 (지역), 부서 이름 (이름), 부서의 사람 수 (Empcount) 및 시설 시간 (생일)과 같은 분야로 구성됩니다. 우리는 영역과 부서 이름을 공동 기본 키로 사용합니다.
4.1 대상 클래스 : Department.java
공공 클래스 부서 { /** 1 차 키 연관 속성을 추상화하여이를 클래스에 별도로 작성하십시오* /// 개인 문자열 영역; // 개인 문자열 이름; / ** 기본 키 클래스 객체를 멤버 변수로 준비*/ Private Departmentpk Departmentpk; 개인 int empcount; 개인 데이트 생일; // public String getArea () {// return area; //} // // public void setarea (문자열 영역) {// this.area = area; //} // // public String getName () {// return name; //} // // public void setName (문자열 이름) {// this.name = 이름; //} public int getempcount () {return empcount; } public void setempcount (int empcount) {this.empcount = empcount; } 공개 날짜 getBirthday () {return birthday; } public void setbirthday (날짜 생일) {this.birthday = 생일; } public departmentpk getDepartmentpk () {return Departmentpk; } public void setDepartmentpk (Departmentpk Departmentpk) {this.departmentpk = departmentpk; }} 4.2 기본 키 클래스 : Departmentpk.java
공공 클래스 Departmentpk는 시리얼이즈 가능한 {개인 정적 최종 긴 SerialversionUid = -28800285915204255L을 구현합니다. 개인 문자열 영역; 개인 문자열 이름; /** * 해시 코드 메소드를 덮어 쓰기 (영역과 이름에 따라 판단 됨) * //@public int hashcode () {Final int prime = 31; int result = 1; result = prime * result + ((area == null)? 0 : area.hashcode ()); result = prime * result + ((name == null)? 0 : name.hashcode ()); 반환 결과; } / ** * exprite equals (영역과 이름에 따라 판단 됨) * / @override public boolean equals (object obj) {if (this == obj) true; if (obj == null) false를 반환합니다. if (getClass ()! = obj.getClass ()) false를 반환합니다. 최종 Departmentpk 기타 = (Departmentpk) obj; if (area == null) {if (기타. area! = null) false를 반환합니다. } else if (! area.equals (기타.area)) false를 반환합니다. if (name == null) {if (other.name! = null) false를 반환합니다. } else if (! name.equals (기타 .name)) false를 반환합니다. 진실을 반환하십시오. } public String getArea () {반환 영역; } public void setArea (문자열 영역) {this.area = 영역; } public String getName () {return name; } public void setName (문자열 이름) {this.name = 이름; }} 4.3 파일 매핑 부서 .hbm.xml
<? XML 버전 = "1.0"?> <! DocType Hibernate Mapping Public "-// Hibernate/Hibernate 매핑 DTD 3.0 // name = "com.yangfei.hibernate.compositepk.entity.department"table = "hibernate_dept_compositepk"> <!-Union 1 차 키-> <!-이름을 기본 키 객체 속성-> <composite-id name = "vactionpk"> <!-<keyproperty입니다. 이름 = "이름" /> < /composite-id> <!-기타 속성-> <속성 이름 = "empcount"길이 = "4" /> <속성 이름 = "생일"유형 = "날짜" /> < /class> < /hibernate-mapping>
4.4 Hibernate 구성 파일 Hibernate.cfg.xml
<? XML 버전 = '1.0'인코딩 = 'UTF-8'?> <! DocType Hibernate-Configuration Public "-// Hibernate/Hibernate Configuration DTD 3.0 // en" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <! 도구. -> <hibernate-configuration> <session-factory> <property name = "dialect"> org.hibernate.dialect.oracle9dialect </property name = "connection.url"> jdbc : thin :@127.0.0.1 : 1521 : orcl10 </property name = "connection.username"> 이름 = "Connection.Password"> yf123 </property> <property name = "Connection.driver_class"> oracle.jdbc.driver.oracledriver </property> <property name = "hibernate.show_sql"> true </property> <mapping resource = "com/yangfei/hibernate/compositepk/entrity/department/d.xml </session-factory> </hibernate-configuration>
4.5 테스트 클래스 : Department -Test.java
공개 클래스 부서 테스트는 테스트 케이스를 확장합니다 { / *** 테스트 삽입 데이터* / public void save () {세션 세션 = hibernateutils.getSession (); 트랜잭션 t = session.begintransaction (); try {Department dept = new Department (); / ** 기본 키 객체 생성*/ Departmentpk deptpk = new Departmentpk (); deptpk.setarea ( "베이징"); deptpk.setName ( "R & D Department"); DEPT.SETDEPARTMENTPK (DEPTPK); 부서 setempcount (100); 부서 세트 비어 데이 (new date ()); 세션 .Save (부서); t.commit (); } catch (HibernateException e) {e.printstacktrace (); t.rollback (); } 마침내 {hibernateutils.closesession (세션); }} / *** 테스트로드 데이터* / public void load () {세션 세션 = hibernateutils.getSession (); 트랜잭션 t = session.begintransaction (); try { / ** 기본 키 객체 생성* / departmentpk deptpk = new Departmentpk (); deptpk.setarea ( "베이징"); deptpk.setName ( "R & D Department"); 부서 부서 = (부서) 세션 .LOAD (Department.Class, deptpk); System.out.println (dept.getDepartmentpk (). getArea ()+","+dept.getDepartMentpk (). getName ()+","+dept.getempcount ()+","+dept.getBirthday ()); } catch (HibernateException e) {e.printstacktrace (); t.rollback (); } 마침내 {hibernateutils.closesession (세션); }} / *** 테스트 수정 데이터* / public void update () {세션 세션 = hibernateutils.getSession (); 트랜잭션 t = session.begintransaction (); try { / ** 기본 키 객체 생성* / departmentpk deptpk = new Departmentpk (); deptpk.setarea ( "베이징"); deptpk.setName ( "R & D Department"); Department Emp = (부서) 세션 .LOAD (Department.Class, deptpk); system.out.println (emp.getDepartMentpk (). getArea ()+","+emp.getDepartMentpk (). getName ()+","+emp.getempcount ()+","+emp.getBirthday ()); emp. setempcount (100); 세션 .saveorupdate (EMP); / ** 기본 키 객체 생성*/ departmentpk deptpk2 = new Departmentpk (); deptpk2.setarea ( "베이징"); deptpk2.setName ( "R & D Department"); 부서 부서 = (부서) 세션 .LOAD (Department.Class, deptpk2); System.out.println (dept.getDepartmentpk (). getArea ()+","+dept.getDepartMentpk (). getName ()+","+dept.getempcount ()+","+dept.getBirthday ()); t.commit (); } catch (HibernateException e) {e.printstacktrace (); t.rollback (); } 마침내 {hibernateutils.closesession (세션); }} / *** 데이터 삭제 데이터* / public void delete () {세션 세션 = hibernateutils.getSession (); 트랜잭션 t = session.begintransaction (); try { / ** 기본 키 객체 생성* / departmentpk deptpk = new Departmentpk (); deptpk.setarea ( "베이징"); deptpk.setName ( "R & D Department"); 부서 부서 = (부서) 세션 .LOAD (Department.Class, deptpk); 세션 .Delete (Dept); t.commit (); } catch (HibernateException e) {e.printstacktrace (); t.rollback (); } 마침내 {hibernateutils.closesession (세션); }}}