다중 매핑
다중 연관성은 객체가 여러 객체와 연관 될 수있는 가장 일반적인 연관 관계입니다. 예를 들어, 하나의 동일한 주소 개체는 여러 직원의 객체와 관련 될 수 있습니다.
RDBMS 정의 테이블 :
직원 기록이 직원 테이블에 저장되어야하는 상황을 고려하십시오. 여기에는 다음 구조가 있습니다.
테이블 직원 생성 (id int not null auto_increment, first_name varchar (20) default null, last_name varchar (20) 기본 널, 급여 int 기본 널, 주소 int, 기본 키 (id));
또한 많은 직원들이 동일한 주소를 가질 수 있으므로이 협회는 많은 일대일 협회를 사용하여 제시 할 수 있습니다. 주소와 관련된 정보를 다음 구조의 별도 테이블에 저장합니다.
테이블 주소 생성 (ID int not null auto_increment, street_name varchar (40) default null, city_name varchar (40) 기본 널, state_name varchar (40) 기본 널, zipcode varchar (10) 기본 null, 기본 키 (id));
RBDMS 테이블을 동시에 만들고 다음 구현을 준비하도록하십시오.
pojo 클래스 정의 :
직원 테이블과 함께 객체와 주소 유형의 변수를 유지하는 데 사용될 POJO 클래스 직원을 구현하겠습니다.
import java.util.*; 공공 클래스 직원 {private int id; 개인 문자열 firstName; 개인 문자열 마지막 이름; 개인 INT 급여; 개인 주소 주소; 공공 직원 () {} 공공 직원 (문자열 fname, 문자열 lname, int 급여, 주소 주소) {this.firstname = fname; this.lastname = lname; this.salary = 급여; address = 주소; } 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 = 월급; } 공개 주소 getAdDress () {반환 주소; } public void setAddress (주소 주소) {this.address = 주소; }}주소 객체가 주소 테이블에 다른 pojo 클래스를 저장하고 검색 할 수 있도록 해당 주소 테이블을 정의해야합니다.
import java.util.*; 공개 클래스 주소 {private int id; 개인 끈 거리; 개인 문자열 도시; 개인 문자열 상태; 개인 문자열 zipcode; 공개 주소 () {} 공개 주소 (String Street, String City, String State, String Zipcode) {this.street = street; this.city = 도시; this.state = state; this.zipcode = zipcode; } public int getId () {return id; } public void setid (int id) {this.id = id; } public String getStreet () {return street; } public void setstreet (String Street) {this.street = street; } public String getCity () {return City; } public void setcity (String City) {this.city = City; } public String getState () {return state; } public void setstate (문자열 상태) {this.state = state; } public String getZipCode () {return ZipCode; } public void setzipcode (String Zipcode) {this.zipcode = zipcode; }} 최대 절전 모드 매핑 파일 정의 :
클래스 맵을 데이터베이스 테이블에 정의하는 방법을 최대 절전 모드에 지시하는 매핑 파일을 개발하십시오. <다가요> 처리 요소는 직원과 주소 단체 간의 다중 관계를 설정하기위한 규칙을 정의하는 데 사용됩니다.
<? 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> <속성 이름 = "FirstName"열 = "first_name"type = "string"/> <property name = "lastname"column = "last_name"type = "string"/> <property name = "salary" "column ="sense = "ints" NOT-NULL = "true"/> </class> <class name = "address"table = "address"> <meta attribute = "class-description">이 클래스에는 주소 세부 사항이 포함됩니다. </meta> <id name = "id"type = "int"열 = "id"> <generator/> </id> <속성 "열 ="street "column ="street_name "type ="string "/> <city"열 = "city_name"type = "string"/> <property name = "state_name ="string ""Zip ""Zip " 유형 = "String"/> </class> </hibernate-mapping>
저장 해야하는 매핑 파일의 형식 <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 데이터 유형으로 변환되는 최대 절전 모드 매핑 유형을 저장합니다.
<다가요> 처리 요소는 직원과 주소 주체 간의 관계를 설정하는 데 사용됩니다. 이름 속성은 상위 클래스에 정의 된 변수로 설정되며,이 경우 주소입니다. 열 속성은 상위 테이블 직원 세트의 열 이름에 사용됩니다.
마지막으로 응용 프로그램 클래스의 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 (); / * 하나의 주소 객체를 갖도록하겠습니다 */ 주소 주소 = me.addAddress ( "Kondapur", "Hyderabad", "AP", "532"); / * 데이터베이스에서 직원 레코드 추가 */ 정수 Empid1 = Me.addemployee ( "Manoj", "Kumar", 4000, 주소); / * 데이터베이스에 다른 직원 레코드를 추가 */ 정수 EMPID2 = ME.addemployee ( "Dilip", "Kumar", 3000, 주소); / * 모든 직원을 나열하십시오 */ me.listemployee (); / * 직원의 급여 기록 업데이트 */ me.updateemployee (Empid1, 5000); / * 데이터베이스에서 직원을 삭제 */ me.deleteemployee (EMPID2); / * 모든 직원을 나열하십시오 */ me.listemployees (); } / * 데이터베이스에서 주소 레코드를 추가하는 메소드 * / 공개 주소 주소 AddressAddress (String Street, String City, String State, String Zipcode) {세션 세션 = factory.opensession (); 트랜잭션 tx = null; 정수 addressID = null; 주소 주소 = null; try {tx = session.begintransaction (); 주소 = 새 주소 (거리, 도시, 주, 우편 번호); addressID = (Integer) session.save (주소); tx.commit (); } catch (HibernateException e) {if (tx! = null) tx.rollback (); e.printstacktrace (); } 마침내 {session.close (); } 반환 주소; } / * 데이터베이스에서 직원 레코드를 추가하는 방법 * / public integer addemployee (문자열 fname, 문자열 lname, int 월급, 주소 주소) {세션 세션 = factory.opensession (); 트랜잭션 tx = null; 정수 EmployeeId = null; try {tx = session.begintransaction (); 직원 직원 = 신입 사원 (fname, lname, 월급, 주소); 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 iterator = Employegator (); iterator.hasnext ();) {Employee Employee = (Employee) iterator.next (); System.out.print ( "이름 :" + Employee.getFirstName ()); System.out.print ( "성 :" + Employee.getLastName ()); System.out.println ( "급여 :" + Employee.getSalary ()); 주소 추가 = Employee.getAddress (); System.out.println ( "주소"); System.out.println ( "Street :" + add.getStreet ()); System.out.println ( "City :" + add.getCity ()); System.out.println ( "state :" + add.getState ()); System.out.println ( "zipcode :" + add.getzipcode ()); } 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 = (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 (); }}} 컴파일 및 실행 :
위의 응용 프로그램을 컴파일하고 실행하는 단계는 다음과 같습니다. 컴파일 및 실행 전에 경로와 클래스 경로가 적절하게 설정되어 있는지 확인하십시오.
화면에서 다음 결과를 얻고 직원과 주소 테이블 모두에서 레코드가 생성됩니다.
$ java manageemployee
..... 다양한 로그 메시지가 여기에 표시됩니다 ......... 이름 : Manoj 성직자 : Kumar Salary : 4000address Street : Kondapur City : HydaRabad State : AP Zipcode : 532First 이름 : Dilip Salary : Kumar Salary : 3000address Street : Kondapur City : Hyderabad State : Ap Zipcode : Manoj 성직자 : 532first Street : 532first Street : 532first Street : Manoj. Kondapur City : Hyderabad 주 : AP Zipcode : 532
직원 및 주소 테이블을 확인하면 다음을 기록해야합니다.
MySQL> 직원에서 선택 *;
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
mysql> select * from address;
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
일대일 매핑
중복 요소가 포함되지 않은 Java 컬렉션 세트를 사용하여 일대일 매핑을 구현할 수 있습니다. 우리는 최대 절전 모드에서 맵을 설정하는 방법을 보았으므로 매핑 세트에 대해 배운 경우 모든 설정을 일대일 매핑에 사용할 수 있습니다.
세트는 맵 테이블의 <set> 요소에 매핑되며 java.util.hashset에서 초기화됩니다. 클래스에서 세트 컬렉션을 사용할 수 있으며, 복제가 필요하지 않은 컬렉션에 요소가 있습니다.
우리는 여전히 위의 예에 정의 된 rdbms 테이블과 pojo 클래스를 사용합니다.
최대 절전 모드 매핑 파일 정의 :
데이터베이스 테이블의 매핑 파일에 매핑 된 클래스를 정의하는 방법을 최대 절전 모드로 지시 해 봅시다.
<? 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> <set name = "set name ="atertireeee_id "/> <one-to-many/> </set> <property name ="firstname ""first_name "string ="string ""string "" ""kold "" ""string "" " type = "string"/> <property name = "Salary"column = "Salary"type = "int"/> </class> <class name = "certificate"table = "인증서"> <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> 요소는 기본 키 값을 자동으로 생성하는 데 사용됩니다. 생성 된 요소의 클래스 속성을 기본적으로 최대 절전 모드로 설정하여 기본 데이터베이스의 지원 기능에 따라 기본 키를 생성하기 위해 ID, 시퀀스 또는 HILO 알고리즘을 만들도록합니다.
<property> 요소는 자바 클래스의 속성을 데이터베이스 테이블의 열에 매핑하는 데 사용됩니다. 요소의 이름 속성은 속성의 클래스를 나타내고 열 속성은 데이터베이스 테이블의 열을 나타냅니다. 유형 속성은 Java에서 SQL 데이터 유형으로 변환되는 최대 절전 모드 매핑 유형을 저장합니다.
<set> 요소는 인증서와 직원 클래스 간의 관계를 설정합니다. 우리는 캐스케이드 속성의 <set> 요소를 사용하여 Hibernate에게 인증서 객체를 저장하고 직원 개체이기도합니다. 이름 속성은 상위 클래스에 정의 된 변수 세트로 설정되며, 예에서는 인증서입니다. 각 변수 세트에 대해 매핑 파일에서 별도의 요소 세트를 정의해야합니다.
<키> 요소는 외국 키, 즉 인증서 테이블의 열이 포함 된 상위 객체입니다. 테이블 직원.
<일대일 요소는 직원 객체에 많은 인증서가 포함되어 있음을 나타냅니다.
응용 프로그램 클래스 생성 :
마지막으로 응용 프로그램 클래스의 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 (); / * 첫 번째 직원에 대한 인증서 세트를 갖도록하겠습니다 */ Hashset set1 = new Hashset (); set1.add (새 인증서 ( "MCA")); set1.add (새 인증서 ( "MBA")); set1.add (새 인증서 ( "MBA")); set1.add (새 인증서 ( "PMP")); / * 데이터베이스에서 직원 레코드 추가 */ 정수 Empid1 = Me.addemployee ( "Manoj", "Kumar", 4000, set1); / * 두 번째 직원에 대한 다른 인증서 세트 */ Hashset set2 = new Hashset (); set2.add (새 인증서 ( "BCA")); set2.add (새 인증서 ( "ba")); / * 데이터베이스에서 다른 직원 레코드를 추가 */ 정수 Empid2 = me.addemployee ( "dilip", "kumar", 3000, set2); / * 모든 직원을 나열하십시오 */ me.listemployee (); / * 직원의 급여 기록 업데이트 */ me.updateemployee (Empid1, 5000); / * 데이터베이스에서 직원을 삭제 */ me.deleteemployee (EMPID2); / * 모든 직원을 나열하십시오 */ me.listemployee (); } / * 데이터베이스에서 직원 레코드를 추가하는 방법 * / public integer addemployee (문자열 fname, 문자열 lname, int senary, set cert) {세션 세션 = inctory.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 ()); 세트 인증서 = 직원 .getCertificates (); for (iterator iterator2 = refertyators.iterator (); iterator2.hasnext ();) {reateral rectName = (인증서) iterator2.next (); System.out.println ( "인증서 :" + certname.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 = (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 (); }}} 컴파일 및 실행 :
$ java manageemployee
..... 다양한 로그 메시지가 여기에 표시됩니다 ......... 이름 : Manoj 성 : Kumar 급여 : 4000Certificate : Mbacertificate : Mcafirst 이름 : McAfirst 이름 : Dilip 성직자 : Kumar 급여 : 3000 계약 : Bcacertificate : Bafirst 이름 : Manoj 성 연봉 : 5000certificate : MCA의 MCA.
직원 및 인증서 양식을 확인하면 다음을 기록해야합니다.
MySQL> 직원에서 선택 *;
+---------------------------+----------+| id | First_name | Last_name | 급여 |+-------------------------------------------------------+| 1 | Manoj | 쿠마르 | 5000 |+-------------------------------------------------+1 행 (0.00 초)
MySQL> 선정 * 인증서;
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------