多くのマッピング
オブジェクトを複数のオブジェクトに関連付けることができる最も一般的な関連性の関係は、多くのアソシエーションです。たとえば、1つの同一のアドレスオブジェクトは、複数の従業員のオブジェクトに関連付けられている場合があります。
RDBMSテーブルを定義します:
従業員のテーブルに従業員の記録を保存する必要がある状況を考えてみましょう。これには、次の構造があります。
テーブルの従業員を作成する(ID int not null auto_increment、first_name varchar(20)デフォルトnull、last_name varchar(20)デフォルトnull、給与intデフォルトnull、アドレスint not null、primary key(id));
さらに、多くの従業員が同じ住所を持つことができるため、この協会は多くの1対1の協会を使用して提示できます。アドレスに関連する情報を次の構造で別のテーブルに保存します。
テーブルアドレスの作成(ID int not not null auto_increment、street_name varchar(40)デフォルトnull、city_name varchar(40)デフォルトnull、state_name varchar(40)デフォルトnull、zipcode varchar(10)デフォルトnull、プライマリキー(ID));
RBDMSテーブルを同時に作成し、次の実装の準備をします。
Pojoクラスを定義します:
オブジェクトの変数とそのアドレスタイプを従業員テーブルに保持するために使用されるPojoクラスの従業員を実装しましょう。
import java.util。*; public class Employee {private int id;プライベート文字列firstName;プライベート文字列lastName;プライベート給与;プライベートアドレスアドレス; public Employee(){} public Employee(string fname、string lname、int salary、addressアドレス){this.firstname = fname; this.lastname = lname; this.salary = salary; this.address = 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(){return Salary; } public void setSalary(int salary){this.salary = salary; } public address getAddress(){アドレスアドレス; } public void setAddress(アドレスアドレス){this.address = address; }}アドレスオブジェクトがアドレステーブルに別のPOJOクラスを保存および取得できるように、対応するアドレステーブルを定義する必要があります。
import java.util。*; public classアドレス{private int id;プライベートストリングストリート;プライベートストリングシティ;プライベートストリング状態;プライベート文字列zipcode; public Address(){} public Address(String Street、String City、String State、String ZipCode){this.street = Street; this.city = 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(string state){this.state = state; } public string getzipcode(){return zipcode; } public void setzipcode(string zipcode){this.zipcode = zipcode; }} Hibernateマッピングファイルを定義します。
クラスマップをデータベーステーブルに定義する方法をHibernateに指示するマッピングファイルを開発します。 <多くの1対1の処理要素を使用して、従業員と住所エンティティの間に多面的な関係を確立するためのルールを定義します。
<?xml version = "1.0" encoding = "utf-8"?> <!doctype hibernate-mapping public " - // hibernate/hibernateマッピングdtd // en" "http://www.hibernate.org/dtd/dtd/hibernate-mapping-33.0.dtd"> "luppelace-mapping ="> <class-maps <メタ属性= "class-description">このクラスには、従業員の詳細が含まれています。 </meta> <id name = "id" type = "int" column = "id"> <generator/> </id> <プロパティ名= "firstName" column = "first_name" type = "string"/> <プロパティ名= "lastName"列= "last_name" type = "string"/> <プロパティ名= " not-null = "true"/> </class> <class name = "アドレス"テーブル= "アドレス"> <meta属性= "class-description">このクラスにはアドレスの詳細が含まれています。 </meta> <id name = "id" type = "int" column = "id"> <generator/> </id> <プロパティ名= "Street" column = "Street_name" Type = "String"/> <プロパティ名= "City" column = "City_name" Type = "String"/> <Property Name = "State" column type = "string"/> </class> </hibernate-mapping>
保存する必要があるマッピングファイルのFormat <ClassName> .HBM.XML。ファイルemployee.hbm.xmlをマッピングファイルに保存します。マッピングの詳細のほとんどにすでに精通していますが、マッピングファイルのすべての要素をもう一度見てみましょう。
マッピングされたドキュメントは、2つの<class>要素を含む各クラスに対応するルート要素として<hibernate-mapping>を備えたXMLドキュメントです。
<class>要素は、Javaクラスからのデータベーステーブル固有のマッピングを定義するために使用されます。 Javaクラス名クラス要素の名前属性を指定し、テーブル属性データベーステーブル名を指定します。
<meta>要素は、クラスの説明を作成するために使用できるオプションの要素です。
<id>要素は、クラスの一意のID属性をデータベーステーブルの主キーにマップします。 ID要素の名前属性は、属性のクラスを指し、列属性はデータベーステーブルの列を指します。型属性は、JavaからSQLデータ型に変換されるHibernateマッピングタイプを保存します。
ID要素内の<ジェネレータ>要素の主要なキー値を使用して、自動的に生成されます。生成された要素のクラス属性を設定して、Hibernateがアイデンティティ、シーケンス、またはHILOであるかどうかのアルゴリズムをネイティブにピックアップして、基礎となるデータベースのサポート機能に従ってプライマリキーを作成します。
<property>要素は、Javaクラスのプロパティをデータベーステーブル内の列にマッピングするために使用されます。要素の名前属性は、属性のクラスを指し、列属性はデータベーステーブルの列を指します。型属性は、JavaからSQLデータ型に変換されるHibernateマッピングタイプを保存します。
<多くの1対1>処理要素は、従業員と住所のエンティティとの関係を設定するために使用されます。名前属性は、親クラスで定義された変数に設定されています。この場合、アドレスです。列属性は、親テーブルの従業員セットの列名に使用されます。
最後に、アプリケーションクラスのメイン()メソッドを作成してアプリケーションを実行します。このアプリケーションを使用して、住所と一緒に一部の従業員を節約して住所を記録し、記録上のCRUD操作を申請します。
Java.util。*をインポートします。 org.hibernate.hibernateExceptionをインポートします。 org.hibernate.sessionをインポートします。 Import org.hibernate.transaction; Import org.hibernate.sessionfactory; Import org.hibernate.cfg.configuration; public class managemployee {private static sessionFactory Factory; public static void main(string [] args){try {factory = new configuration()。configure()。buildSessionFactory(); } catch(throwable ex){system.err.println( "SessionFactoryオブジェクトの作成に失敗しました。" + ex);新しい例外initializererror(ex); } managemployee me = new Managemployee(); / * 1つのアドレスオブジェクトを持ってみましょう */アドレスアドレス= me.addaddress( "kondapur"、 "hyderabad"、 "ap"、 "532"); / *データベースに従業員の記録を追加 */ integer empid1 = me.addemployee( "manoj"、 "kumar"、4000、address); / *データベースに別の従業員レコードを追加 */ integer empid2 = me.addemployee( "dilip"、 "kumar"、3000、address); / *すべての従業員をリストダウン */ me.listemployee(); / *従業員の給与記録を更新 */ me.updateemployee(empid1、5000); / *データベースから従業員を削除する */ me.deletemployee(empid2); / *すべての従業員をリストダウン */ me.listemployees(); } / *データベースにアドレスレコードを追加する方法 * /パブリックアドレスアドレスアドレス(String Street、String City、String State、String ZipCode){Session Session = Factory.Opensession();トランザクションTx = null; integer addressId = null;アドレスアドレス= null; try {tx = session.begintransaction();アドレス=新しいアドレス(ストリート、市、州、zipcode); addersId =(integer)session.save(address); tx.commit(); } catch(hibernateException e){if(tx!= null)tx.rollback(); e.printstacktrace(); }最後に{session.close(); }アドレスを返します。 } / *データベースに従業員レコードを追加する方法 * / public Integer addemployee(string fname、string lname、int sal、addressアドレス){session session = factory.opensession();トランザクションTx = null; Integer EmployeeID = null; try {tx = session.begintransaction();従業員従業員=新しい従業員(FNAME、LNAME、給与、住所); EmployeeId =(integer)session.save(Employee); tx.commit(); } catch(hibernateException e){if(tx!= null)tx.rollback(); e.printstacktrace(); }最後に{session.close(); } employeedを返します。 } / *すべての従業員の詳細をリストするメソッドトランザクションTx = null; try {tx = session.begintransaction(); List Employees = session.createquery( "from Employee")。list(); for(iterator iterator = employes.iterator(); iterator.hasnext();){従業員=(従業員)iterator.next(); System.out.print( "名:" + employee.getFirstName()); System.out.print( "last Name:" + Employee.getLastName()); System.out.println( "salary:" + employee.getSalary());アドレスadd = 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(); }} / *従業員の給与を更新するメソッドトランザクションTx = null; try {tx = session.begintransaction();従業員従業員=(従業員)session.get(Employee.Class、EmployeeID);従業員。 session.update(従業員); tx.commit(); } catch(hibernateException e){if(tx!= null)tx.rollback(); e.printstacktrace(); }最後に{session.close(); }} / *レコードから従業員を削除する方法 * / public void deletemployee(integer EmployeeID){session session = factory.opensession();トランザクションTx = null; try {tx = session.begintransaction();従業員従業員=(従業員)session.get(Employee.Class、EmployeeID); session.delete(従業員); tx.commit(); } catch(hibernateException e){if(tx!= null)tx.rollback(); e.printstacktrace(); }最後に{session.close(); }}}コンパイルと実行:
上記のアプリケーションをコンパイルして実行する手順は次のとおりです。コンパイルして実行する前に、パスとクラスパスが適切に設定されていることを確認してください。
画面で次の結果を取得し、従業員とアドレステーブルの両方に記録が作成されます。
$ Java Managemployee
.....さまざまなログメッセージがここに表示されます.........名:Manoj姓:Kumar給与:4000Address Street:Kondapur City:Hyderabad State:AP Zipcode:532first Name:Kumar Salary:Kumar Salary:3000Address Street:Kondapur City:Hyderabad State:AP Zipcode:532ffirst:532firstirst:532firstirsストリート:コンダプール市:ハイデラバード州:AP ZIPCODE:532
従業員と住所テーブルを確認する場合は、次のことを記録する必要があります。
mysql> select * from Employee;
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
mysql> select * from address;
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1対多マッピング
重複した要素を含まないJavaコレクションのセットを使用して、1対多くのマッピングを実装できます。 Hibernateでマップを設定する方法を見てきたので、セットマッピングについて学んだ場合は、すべての設定を1対多数のマッピングに使用できます。
セットは、マップテーブルの<set>要素にマッピングされ、java.util.hashsetで初期化されます。複製を必要としないコレクションの要素を使用して、クラス内のセットコレクションを使用できます。
上記の例で定義されているRDBMSテーブルとPojoクラスを使用しています。
Hibernateマッピングファイルを定義します。
Hibernateに、データベーステーブルのマッピングファイルにマッピングされたクラスを定義する方法を指示しましょう。
<?xml version = "1.0" encoding = "utf-8"?> <!doctype hibernate-mapping public " - // hibernate/hibernateマッピングdtd // en" "http://www.hibernate.org/dtd/dtd/hibernate-mapping-33.0.dtd"> "luppelace-mapping ="> <class-maps <メタ属性= "class-description">このクラスには、従業員の詳細が含まれています。 </meta> <id name = "id" type = "int" column = "id"> <generator/> </id> <set name = "cascade =" all "> <key column =" employe _id "/> <one-many/> </set> <property name =" firstname "column =" firstname "typen" type = "string"/> <プロパティ名= "給与"列= "salary" type = "int"/> </class> <class name = "emperist" table "> <meta属性=" class-description ">このクラスには証明書記録が含まれています。 </meta> <id name = "id" type = "int" column = "id"> <generator/> </id> <プロパティname = "name" column = "certilement_name" typen
保存する必要があるマッピングファイルのFormat <ClassName> .HBM.XML。ファイルemployee.hbm.xmlをマッピングファイルに保存します。マッピングの詳細のほとんどにはすでに精通していますが、マッピングファイルのすべての要素をもう一度見てみましょう。
マッピングされたドキュメントは、2つの<class>要素を含む各クラスに対応するルート要素として<hibernate-mapping>を備えたXMLドキュメントです。
<class>要素は、Javaクラスからのデータベーステーブル固有のマッピングを定義するために使用されます。 Javaクラス名クラス要素の名前属性を指定し、テーブル属性データベーステーブル名を指定します。
<meta>要素は、クラスの説明を作成するために使用できるオプションの要素です。
<id>要素は、クラスの一意のID属性をデータベーステーブルの主キーにマップします。 ID要素の名前属性は、属性のクラスを指し、列属性はデータベーステーブルの列を指します。型属性は、JavaからSQLデータ型に変換されるHibernateマッピングタイプを保存します。
ID要素内の<Generator>要素を使用して、プライマリキー値を自動的に生成します。生成された要素のクラス属性を設定して、HibernateがID、シーケンス、またはHiloアルゴリズムをネイティブにピックアップして、基礎となるデータベースのサポート機能に従ってプライマリキーを作成します。
<property>要素は、Javaクラスのプロパティをデータベーステーブル内の列にマッピングするために使用されます。要素の名前属性は、属性のクラスを指し、列属性はデータベーステーブルの列を指します。型属性は、JavaからSQLデータ型に変換されるHibernateマッピングタイプを保存します。
<set>要素は、証明書と従業員クラスの関係を設定します。 Cascade属性の<set>要素を使用して、Hibernateに証明書オブジェクトを保存し、従業員オブジェクトになるように指示します。名前属性は、親クラスで定義された変数のセットに設定されています。例では、証明書です。変数のセットごとに、マッピングファイルに個別の要素セットを定義する必要があります。
<key>要素は、外部キー、つまり証明書テーブルの列を含む親オブジェクトです。テーブルの従業員。
<one-many>要素は、従業員オブジェクトに多くの証明書が含まれることを示します。
アプリケーションクラスを作成します:
最後に、アプリケーションクラスのメイン()メソッドを作成してアプリケーションを実行します。このアプリを使用して、記録証明書と一緒に一部の従業員を節約し、CRUD操作レコードを適用します。
Java.util。*をインポートします。 org.hibernate.hibernateExceptionをインポートします。 org.hibernate.sessionをインポートします。 Import org.hibernate.transaction; Import org.hibernate.sessionfactory; Import org.hibernate.cfg.configuration; public class managemployee {private static sessionFactory Factory; public static void main(string [] args){try {factory = new configuration()。configure()。buildSessionFactory(); } catch(throwable ex){system.err.println( "SessionFactoryオブジェクトの作成に失敗しました。" + ex);新しい例外initializererror(ex); } managemployee me = new Managemployee(); / *最初の従業員のための一連の証明書を作成しましょう */ hashset set1 = new Hashset(); set1.add(new Certificate( "MCA")); set1.add(new証明書( "MBA")); set1.add(new証明書( "MBA")); set1.add(new証明書( "PMP")); / *データベースに従業員の記録を追加 */ integer empid1 = me.addemployee( "manoj"、 "kumar"、4000、set1); / * 2番目の従業員の別の証明書セット */ hashset set2 = new Hashset(); set2.add(new証明書( "bca")); set2.add(new証明書( "ba")); / *データベースに別の従業員レコードを追加 */整数empid2 = me.addemployee( "dilip"、 "kumar"、3000、set2); / *すべての従業員をリストダウン */ me.listemployee(); / *従業員の給与記録を更新 */ me.updateemployee(empid1、5000); / *データベースから従業員を削除する */ me.deletemployee(empid2); / *すべての従業員をリストダウン */ me.listemployee(); } / *データベースに従業員レコードを追加する方法 * / public Integer addemployee(string fname、string lname、int salary、set cert){session session = factory.opensession();トランザクションTx = null; Integer EmployeeID = null; try {tx = session.begintransaction();従業員従業員=新しい従業員(FNAME、LNAME、SALARY); employee.setCertificates(cert); EmployeeId =(integer)session.save(Employee); tx.commit(); } catch(hibernateException e){if(tx!= null)tx.rollback(); e.printstacktrace(); }最後に{session.close(); } employeedを返します。 } / *すべての従業員の詳細をリストするメソッドトランザクションTx = null; try {tx = session.begintransaction(); List Employees = session.createquery( "from Employee")。list(); for(iterator iterator1 = employes.iterator(); iterator1.hasnext();){従業員=(従業員)iterator1.next(); System.out.print( "名:" + employee.getFirstName()); System.out.print( "last Name:" + Employee.getLastName()); System.out.println( "salary:" + employee.getSalary());証明書を設定= employee.getCertificates(); for(iterator iterator2 = certificates.iterator(); iterator2.hasnext();){certivate certname =(certimal)iterator2.next(); system.out.println( "certificate:" + certname.getName()); }} tx.commit(); } catch(hibernateException e){if(tx!= null)tx.rollback(); e.printstacktrace(); }最後に{session.close(); }} / *従業員の給与を更新するメソッドトランザクションTx = null; try {tx = session.begintransaction();従業員従業員=(従業員)session.get(Employee.Class、EmployeeID);従業員。 session.update(従業員); tx.commit(); } catch(hibernateException e){if(tx!= null)tx.rollback(); e.printstacktrace(); }最後に{session.close(); }} / *レコードから従業員を削除する方法 * / public void deletemployee(integer EmployeeID){session session = factory.opensession();トランザクションTx = null; try {tx = session.begintransaction();従業員従業員=(従業員)session.get(Employee.Class、EmployeeID); session.delete(従業員); tx.commit(); } catch(hibernateException e){if(tx!= null)tx.rollback(); e.printstacktrace(); }最後に{session.close(); }}}コンパイルと実行:
$ Java Managemployee
.....さまざまなログメッセージがここに表示されます.........名:Manoj姓:Kumar給与:4000certifificate:mbacertificate:pmpcertificate:mcafirst name:dilip last name:kumar salary:3000certificate:bcacertifificate:bafirst name:manoj last:kumar salarie:5000certificatetipeptepectifetipate
従業員と証明書フォームを確認する場合は、次のことを記録する必要があります。
mysql> select * from Employee;
+----------------------------+----------+| ID | first_name | last_name |給与|+-------------------------------------+-----------+----------+| 1 |マノジ|クマール| 5000 |+---------------------------------+--------+1列のセット(0.00秒)
mysql> select * from emperipation;
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------