지도 매핑
맵 맵은 요소를 키 값 쌍으로 저장하고 목록에 중복 요소를 허용하지 않는 Java 컬렉션입니다. MAP 인터페이스는 세 가지 수집보기를 제공하여 맵 컨텐츠를 키 값 컬렉션 세트로 간주하거나 키 값 매핑 관계를 설정할 수 있습니다.
맵은 매핑 테이블의 <map> 요소에 매핑되며 java.util.hashmap에서 정렬되지 않은 맵을 초기화 할 수 있습니다.
RDBMS 정의 테이블 :
직원 기록이 직원 테이블에 저장되어야하는 상황을 고려하십시오. 여기에는 다음 구조가 있습니다.
테이블 직원 생성 (id int null auto_increment, first_name varchar (20) 기본 널, last_name varchar (20) 기본 널, 급여 int 기본 널, 기본 키 (id));
또한 각 직원은 그와 관련된 하나 이상의 인증서를 가질 수 있다고 가정합니다. 인증서의 관련 정보는 다음과 같은 구조를 가진 별도의 테이블에 저장합니다.
테이블 인증서 생성 (id int not null auto_increment, chertient_type varchar (40) default null, certient_name varchar (30) 기본 null, Employee_id int 기본 널, 기본 키 (id));
직원과 인증서 개체 사이에는 일대일 관계가 있습니다.
pojo 클래스 정의 :
직원 테이블에서 객체 모음을 보유하는 데 사용되는 Pojo 클래스 직원과 인증서가있는 목록 변수를 구현하겠습니다.
import java.util.*; 공공 클래스 직원 {private int id; 개인 문자열 firstName; 개인 문자열 마지막 이름; 개인 INT 급여; 개인지도 인증서; 공공 직원 () {} 공공 직원 (문자열 fname, 문자열 lname, int 월급) {this.firstname = fname; this.lastname = lname; this.salary = 급여; } public int getId () {return id; } public void setid (int id) {this.id = id; } public String getFirstName () {return firstName; } public void setFirstName (String First_Name) {this.firstName = first_name; } public String getLastName () {return lastName; } public void setLastName (string last_name) {this.lastname = last_name; } public int getSalary () {반환 급여; } public void setSalary (int 급여) {this.salary = 월급; } 공개지도 getCertificates () {리턴 인증서; } public void setCertificates (지도 인증서) {this.certificates = 인증서; }}다른 pojo 클래스를 정의하려면 해당 인증서 테이블이 필요합니다. 그러한 인증서 객체는 인증서 테이블을 저장하고 검색 할 수 있습니다.
공개 수업 인증서 {private int id; 개인 문자열 이름; 공개 인증서 () {} 공개 인증서 (문자열 이름) {this.name = 이름; } public int getId () {return id; } public void setid (int id) {this.id = id; } public String getName () {return name; } public void setName (문자열 이름) {this.name = 이름; }} 최대 절전 모드 매핑 파일 정의 :
데이터베이스 테이블에 매핑 된 클래스를 정의하는 방법을 최대 절전 모드에 지시하는 매핑 파일을 개발해 봅시다. <map> 요소는 사용 된 맵의 규칙을 정의하는 데 사용됩니다.
<? xml version = "1.0"encoding = "utf-8"?> <! doctype hibernate-mapping public "-// hibernate mapping dtd // en" "http://www.hibernate.org/dtdd/hibernate-mapping-3.0.dtd"> <ClasseMApping> ""Hibernate> " table = "Employee"> <meta attribute = "class-description">이 클래스에는 직원 세부 사항이 포함되어 있습니다. </meta> <id name = "id"type = "int"column = "id"> <generator/> </id> <map name = "cascade"cascade = "all"> <key column = "Employee_id"/> <index column = "reatireate_type"type = "string"/> <oneto-many/> </map name = "first _"type ""firstname ""firstname ""firstname " 이름 = "lastname"column = "last_name"type = "string"/> <속성 이름 = "급여"열 = "급여"유형 = "int"/</class> <class name = "인증서"테이블 = "인증서"> <meta attribute = "class-description". 매
저장 해야하는 매핑 파일의 형식 <classname> .hbm.xml. 매핑 파일에 eployee.hbm.xml 파일을 저장합니다. 대부분의 매핑 세부 사항에 이미 익숙하지만 매핑 파일의 모든 요소를 다시 살펴 보겠습니다.
매핑 된 문서는 2 <class> 요소를 포함하는 각 클래스에 해당하는 루트 요소로 <hibernate-mapping>이있는 XML 문서입니다.
<class> 요소는 Java 클래스에서 데이터베이스 테이블 별 매핑을 정의하는 데 사용됩니다. Java 클래스 이름 클래스 요소의 이름 속성을 지정하고 테이블 속성 데이터베이스 테이블 이름을 지정합니다.
<Meta> 요소는 클래스에 대한 설명을 만드는 데 사용할 수있는 선택적 요소입니다.
<id> 요소는 클래스의 고유 ID 속성을 데이터베이스 테이블의 기본 키에 매핑합니다. ID 요소의 이름 속성은 속성의 클래스를 나타냅니다. 열 속성은 데이터베이스 테이블의 열을 나타냅니다. 유형 속성은 Java에서 SQL 데이터 유형으로 변환되는 최대 절전 모드 매핑 유형을 저장합니다.
ID 요소 내의 <generator> 요소는 기본 키 값을 자동으로 생성하는 데 사용됩니다. 생성 된 요소의 클래스 속성을 기본으로 설정하여 최대 절전 모드가 알고리즘, 시퀀스 또는 힐로에서 알고리즘을 선택하여 기본 데이터베이스의 지원 기능에 따라 기본 키를 생성합니다.
<property> 요소는 자바 클래스의 속성을 데이터베이스 테이블의 열에 매핑하는 데 사용됩니다. 요소의 이름 속성은 속성의 클래스를 나타내고 열 속성은 데이터베이스 테이블의 열을 나타냅니다. 유형 속성은 Java에서 SQL 데이터 유형으로 변환되는 최대 절전 모드 매핑 유형을 저장합니다.
<map> 요소는 인증서와 직원 클래스 간의 관계를 설정하는 데 사용됩니다. 캐스케이드 속성의 <map> 요소를 사용하여 인증서 객체를 저장하고 직원 객체에도 최대 절전 모드를 알려줍니다. 이름 속성은 부모 클래스에서 MapVariable을 정의하도록 설정되어 있으며,이 경우 인증서입니다.
<인덱스> 요소는 키와 값의 키/값 쌍을 나타내는 데 사용됩니다. 이 키는 열 증명서 _type에 저장된 문자열 유형을 사용합니다.
<키> 요소는 외국 키, 즉 인증서 테이블의 열이 포함 된 상위 객체입니다. 테이블 직원.
<일대일 요소는 직원 객체에 많은 인증서 개체가 포함되어 있음을 나타냅니다. 따라서 인증서 객체는 직원 학부모 클래스와 관련되어야합니다. 필요에 따라 <1-10>, <다-하나> 또는 <verlo-many> 요소를 사용할 수 있습니다.
응용 프로그램 클래스 생성 :
마지막으로 응용 프로그램 클래스의 메인 () 메소드를 작성하여 응용 프로그램을 실행하십시오. 이 응용 프로그램을 사용하여 인증서 목록과 함께 직원 레코드를 저장 한 다음 응용 프로그램에서 CRUD 작업에 대한 레코드를 수행하십시오.
java.util.*; import org.hibernate.hibernateException; import org.hibernate.session; import org.hibernate.transaction; import org.hibernate.sessionfactory; import org.hibernate.cfg.configuration; public class manageemployee {private static sessionfactory factory; public static void main (string [] args) {try {factory = new configuration (). configure (). buildSessionFactory (); } catch (Throwable ex) {System.err.println ( "SessionFactory 객체를 생성하지 못했습니다." + ex); 새로운 예외를 던지십시오. } manageemployee me = new manageemployee (); / * 첫 번째 직원에 대한 인증서 세트를 갖도록하겠습니다. */ hashmap set = new Hashmap (); set.put ( "computerscience", 새 인증서 ( "MCA")); set.put ( "BusinessManagement", 새 인증서 ( "MBA")); set.put ( "ProjectManagement", 새 인증서 ( "PMP")); / * 데이터베이스에서 직원 레코드 추가 */ 정수 Empid = me.addemployee ( "Manoj", "Kumar", 4000, set); / * 모든 직원을 나열하십시오 */ me.listemployee (); / * 직원의 급여 기록 업데이트 */ me.updateemployee (Empid, 5000); / * 모든 직원을 나열하십시오 */ me.listemployees (); } / * 데이터베이스에서 직원 레코드를 추가하는 방법 * / public integer addemployee (문자열 fname, 문자열 lname, int salary, hashmap cert) {session session = factory.opensession (); 트랜잭션 tx = null; 정수 EmployeeId = null; try {tx = session.begintransaction (); 직원 = 신입 사원 (FNAME, LNAME, 월급); Employee.setCertificates (cert); EmployeeId = (Integer) Session.Save (직원); tx.commit (); } catch (HibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } 마침내 {session.close (); } return EmployeeId; } / * 모든 직원 세부 정보를 나열하는 방법 * / public void listemployees () {세션 세션 = factory.opensession (); 트랜잭션 tx = null; try {tx = session.begintransaction (); List Employees = session.createrecer ( "직원에서"). list (); for (iterator iterator1 = EmployE.ITERATOR (); iterator1.hasnext ();) {Employee Employee = (Employee) iterator1.next (); System.out.print ( "이름 :" + Employee.getFirstName ()); System.out.print ( "성 :" + Employee.getLastName ()); System.out.println ( "급여 :" + Employee.getSalary ()); MAP EC = Employee.getCertificates (); System.out.println ( "인증서 :" + ((((())) ec.get ( "computerscience")). getName ()); System.out.println ( "인증서 :" + (((인증서))). (((인증서) ec.get ( "projectmanagement"). getName ())); "인증서 :" + (((인증서) ec.get ( "projectmanagement")). getName ()); e.printstacktrace ()}}}; 직원. deleteemployee (정수) (tx! = null) tx.rollback (); 컴파일 및 실행 :
위의 응용 프로그램을 컴파일하고 실행하는 단계는 다음과 같습니다. 컴파일하고 실행하기 전에 경로와 클래스 경로를 적절하게 설정했는지 확인하십시오.
다음 결과는 화면에서 얻을 것이며 레코드는 직원과 인증서 양식으로 작성됩니다.
$ java manageemployee
..... 다양한 로그 메시지가 여기에 표시됩니다 .........
이름 : Manoj 성 : Kumar 급여 : 4000 계약 : McAcertificate : Mbacertificate : PMPFirst 이름 : Manoj 성 : Kumar 급여 : 5000Certificate : McAcertificate : Mbacertificate : PMP
직원 및 인증서 양식을 확인하면 다음을 기록해야합니다.
MySQL> 직원에서 선택 *;
+---------------------------------------+| id | First_name | Last_name | 급여 |+------------------------------------------------------+| 60 | Manoj | 쿠마르 | 5000 |+----------------------------------------------+1 행 (0.00 초)
MySQL> 선정 * 인증서;
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
정렬 맵 매핑
SortedMap은 키 값 쌍에 저장된 요소이며 매핑 용 Java 컬렉션과 유사한 전체 종류의 키를 제공합니다. 매핑에서는 중복 요소가 허용되지 않습니다. 맵은 키의 자연 순서로 정렬되거나 일반적으로 주문한 맵의 생성 시간에 비교를 제공하여 정렬됩니다.
SortedMap을 매핑하는 <map> 요소 및 순서 맵은 매핑 테이블에 매핑 된 java.util.treemap에서 초기화 될 수 있습니다.
우리는 여전히 위에서 정의 된 RDBMS 테이블과 POJO 클래스를 사용하여 다음 예를 설명합니다.
최대 절전 모드 매핑 파일 정의 :
데이터베이스 테이블에 매핑 된 클래스를 정의하는 방법을 최대 절전 모드에 지시하는 매핑 파일을 개발해 봅시다. <map> 요소는 사용 된 맵의 규칙을 정의하는 데 사용됩니다.
<? xml version = "1.0"encoding = "utf-8"?> <! doctype hibernate-mapping public "-// hibernate mapping dtd // en" "http://www.hibernate.org/dtdd/hibernate-mapping-3.0.dtd"> <ClasseMApping> ""Hibernate> " table = "Employee"> <meta attribute = "class-description">이 클래스에는 직원 세부 사항이 포함되어 있습니다. </meta> <id name = "id"type = "int"column = "id"> <generator/> </id> <map name = "cascade"cascade = "all"sort = "myclass"> <key column = "Employee_id"/> <index column = "refloypate_type"type = "string"/> <first-to-many/> <firstingname " type = "string"/> <property name = "lastname"column = "last_name"type = "string"/> <속성 이름 = "Salary"column = "Salary"type = "int"/> </class> <class name = "table ="pratipate "> <meta attribute ="class-description ">이 클래스 레코드가 포함됩니다. 매
저장 해야하는 매핑 파일의 형식 <classname> .hbm.xml. 매핑 파일 직원 .hbm.xml을 저장합니다. 대부분의 매핑 세부 사항에 이미 익숙하지만 매핑 파일의 모든 요소를 다시 살펴 보겠습니다.
매핑 된 문서는 2 <class> 요소를 포함하는 각 클래스에 해당하는 <hibernate-mapping>의 루트 요소가있는 XML 문서입니다.
<class> 요소는 Java 클래스에서 데이터베이스 테이블 별 매핑을 정의하는 데 사용됩니다. Java 클래스 이름 클래스 요소의 이름 속성을 지정하고 테이블 속성 데이터베이스 테이블 이름을 지정합니다.
<Meta> 요소는 클래스에 대한 설명을 만드는 데 사용할 수있는 선택적 요소입니다.
<id> 요소는 클래스의 고유 ID 속성을 데이터베이스 테이블의 기본 키에 매핑합니다. ID 요소의 이름 속성은 속성의 클래스를 나타냅니다. 열 속성은 데이터베이스 테이블의 열을 나타냅니다. 유형 속성은 Java에서 SQL 데이터 유형으로 변환되는 최대 절전 모드 매핑 유형을 저장합니다.
ID 요소 내의 <generator> 요소는 기본 키 값을 자동으로 생성하는 데 사용됩니다. 생성 된 요소의 클래스 속성을 설정하여 최대 절전 모드를 ID, 시퀀스 또는 HILO의 알고리즘에 해당하여 기본 데이터베이스의 지원 기능에 따라 기본 키를 생성합니다.
<property> 요소는 자바 클래스의 속성을 데이터베이스 테이블의 열에 매핑하는 데 사용됩니다. 요소의 이름 속성은 속성의 클래스를 나타내고 열 속성은 데이터베이스 테이블의 열을 나타냅니다. 유형 속성은 Java에서 SQL 데이터 유형으로 변환되는 최대 절전 모드 매핑 유형을 저장합니다.
<map> 요소는 인증서와 직원 클래스 간의 관계를 설정하는 데 사용됩니다. 캐스케이드 속성의 <map> 요소를 사용하여 인증서 객체를 저장하고 직원 객체에도 최대 절전 모드를 알려줍니다. 이름 속성은 부모 클래스에 정의 된 SortedMap 변수로 설정되며,이 경우 인증서입니다. 정렬 속성은 자연 분류로 설정하거나 java.util.comparator로 사용자 정의 클래스 구현으로 설정할 수 있습니다. 인증서 클래스 구현의 정렬 순서를 뒤집기 위해 java.util.comparator로 구현하는 클래스 MyClass를 사용했습니다.
<색인> 요소는 키/값 쌍 맵의 키 부분을 나타내는 데 사용됩니다. 이 키는 열 증명서 _type에 저장된 문자열 유형을 사용합니다.
<키> 요소는 외국 키, 즉 인증서 테이블의 열이 포함 된 상위 객체입니다. 테이블 직원.
<일대일 요소는 직원 객체에 많은 인증서 개체가 포함되어 있음을 나타냅니다. 따라서 인증서 객체는 직원 부모와 연관되어야합니다. 필요에 따라 <1-10>, <다-하나> 또는 <verlo-many> 요소를 사용할 수 있습니다.
Sort = "Natural"을 사용하는 경우 인증서 클래스가 비교 가능한 인터페이스를 구현했으며 Hibernate는 SortedMap () 메소드로 정의 된 인증서 클래스에서 비교를 사용하기 때문에 별도의 클래스를 만들 필요가 없습니다. 그러나 매핑 파일에서 사용자 정의 비교기 클래스 MyClass를 사용하므로 정렬 알고리즘을 기반 으로이 클래스를 만들어야합니다. 맵에서 사용할 수있는 키 정렬을 해 보겠습니다.
import java.util.comparator; public class myclass emplements comparator <string> {public int compar (문자열 o1, 문자열 o2) {final int prever = -1; 마지막 int 이후 = 1; / * 분류 순서를 반전 시키려면, 다중 -1 */ if (o2 == null) {이전 * -1; } 비교 가능한 thiscertificate = O1; 비슷한 thatcertificate = O2; if (thiscertificate == null) { * 1 이후에 반환; } else if (thatcertificate == null) {return * -1; } else {return thiscertificate.compareto (thatcertificate) * -1; }}}마지막으로 응용 프로그램 클래스의 Main () 메소드를 작성하여 응용 프로그램을 실행합니다. 우리는이 응용 프로그램을 사용하여 인증서와 함께 일부 직원 기록을 저장 한 다음 레코드 위에 CRUD 작업을 제출합니다.
java.util.*; import org.hibernate.hibernateException; import org.hibernate.session; import org.hibernate.transaction; import org.hibernate.sessionfactory; import org.hibernate.cfg.configuration; public class manageemployee {private static sessionfactory factory; public static void main (string [] args) {try {factory = new configuration (). configure (). buildSessionFactory (); } catch (Throwable ex) {System.err.println ( "SessionFactory 객체를 생성하지 못했습니다." + ex); 새로운 예외를 던지십시오. } manageemployee me = new manageemployee (); / * 첫 번째 직원에 대한 인증서 세트를 갖도록하겠습니다 */ treemap set1 = new Treemap (); set1.put ( "computerscience", 새 인증서 ( "MCA")); set1.put ( "BusinessManagement", 새 인증서 ( "MBA")); set1.put ( "Projectmanagement", 새 인증서 ( "PMP")); / * 데이터베이스에서 직원 레코드 추가 */ 정수 Empid1 = Me.addemployee ( "Manoj", "Kumar", 4000, set1); / * 두 번째 직원에 대한 다른 인증서 세트 */ treemap set2 = new Treemap (); set2.put ( "computerscience", 새 인증서 ( "MCA")); set2.put ( "BusinessManagement", 새 인증서 ( "MBA")); / * 데이터베이스에서 다른 직원 레코드를 추가 */ 정수 Empid2 = me.addemployee ( "dilip", "kumar", 3000, set2); / * 모든 직원을 나열하십시오 */ me.listemployee (); / * 직원의 급여 기록 업데이트 */ me.updateemployee (Empid1, 5000); / * 데이터베이스에서 직원을 삭제 */ me.deleteemployee (EMPID2); / * 모든 직원을 나열하십시오 */ me.listemployees (); } / * 데이터베이스에서 직원 레코드를 추가하는 방법 * / public integer addemployee (문자열 fname, 문자열 lname, int 급여, treemap cert) {session session = factory.opensession (); 트랜잭션 tx = null; 정수 EmployeeId = null; try {tx = session.begintransaction (); 직원 = 신입 사원 (FNAME, LNAME, 월급); Employee.setCertificates (cert); EmployeeId = (Integer) Session.Save (직원); tx.commit (); } catch (HibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } 마침내 {session.close (); } return EmployeeId; } / * 모든 직원 세부 정보를 나열하는 방법 * / public void listemployees () {세션 세션 = factory.opensession (); 트랜잭션 tx = null; try {tx = session.begintransaction (); List Employees = session.createrecer ( "직원에서"). list (); for (iterator iterator1 = EmployE.ITERATOR (); iterator1.hasnext ();) {Employee Employee = (Employee) iterator1.next (); System.out.print ( "이름 :" + Employee.getFirstName ()); System.out.print ( "성 :" + Employee.getLastName ()); System.out.println ( "급여 :" + Employee.getSalary ()); SortedMap <문자열, 인증서>지도 = Employee.getCertificates (); for (map.Entry <string, certificate> entry : map.entryset ()) {system.out.print ( "/tcertificate type :" + enther.getKey ()); System.out.println ( ", 이름 :" + (enther.getValue ()). getName ()); }} tx.commit (); } catch (HibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } 마침내 {session.close (); }} / * 직원에 대한 급여를 업데이트하는 방법 * / public void updateemployee (Integer EmployeeId, int 월급) {세션 세션 = inctory.opensession (); 트랜잭션 tx = null; try {tx = session.begintransaction (); Employee Employee = (Employee) Session.get (Employee.class, EmployeeId); Employee.SetSalary (급여); 세션 .update (직원); tx.commit (); } catch (HibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } 마침내 {session.close (); }} / * 레코드에서 직원을 삭제하는 방법 * / public void deleteemployee (Integer EmployeeId) {세션 세션 = inctory.opensession (); 트랜잭션 tx = null; try {tx = session.begintransaction (); Employee Employee Employee = (Employee) Session.get (Employee.class, EmployeeId); 세션 .Delete (직원); tx.commit (); } catch (HibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } 마침내 {session.close (); }}} 컴파일 및 실행 :
인증서가 반대 순서로 정렬되었음을 알 수 있습니다. 매핑 파일을 변경하여 Sort = "Natural"을 설정하고 프로그램을 실행하고 결과를 비교하여 시도해 볼 수 있습니다.
$ java manageemployee
..... 다양한 로그 메시지가 여기에 표시됩니다 ......... 이름 : Manoj 성 : Kumar 급여 : 4000 인증서 유형 : 프로젝트 관리 유형 : PMP 인증서 유형 : ComputerScience, 이름 : MCA 인증서 유형 : MCA 인증서 유형 : MBAFIRST 이름 : MBAFIRST 이름 : DILIP 성 이름 : Kumar Salary : 3000 인증서 : MCA의 이름 : MAPITMENGAMENT : MAPITERST STARST STARST STARST STARST STARST. 이름 : Kumar 급여 : 5000 인증서 유형 : 프로젝트 관리, 이름 : PMP 인증서 유형 : Computerscience, 이름 : MCA 인증서 유형 : 사업 관리, 이름 : MBA
직원 및 인증서 양식을 확인하면 다음을 기록해야합니다.
MySQL> 직원에서 선택 *;
+----+-----------------------------+| id | First_name | Last_name | 급여 |+-----------------------------------------------------------+| 74 | Manoj | 쿠마르 | 5000 |+-------------------------------------------------+1 행 (0.00 초)
MySQL> 선정 * 인증서;
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------