マップマッピング
マップマップは、要素をキーと価値のペアに保存するJavaコレクションであり、リスト内の複製要素を許可しません。マップインターフェイスは、3つのコレクションビューを提供し、マップコンテンツをキー価値コレクションのセットと見なすか、キー価値マッピング関係を設定できます。
マップはマッピングテーブルの<Map>要素にマッピングされ、順序付けられていないマップはjava.util.hashmapで初期化できます。
RDBMSテーブルを定義します:
従業員のテーブルに従業員の記録を保存する必要がある状況を考えてみましょう。これには、次の構造があります。
Table Employeeの作成(ID int not null auto_increment、first_name varchar(20)デフォルトnull、last_name varchar(20)デフォルトnull、salary int default null、primary key(id));
さらに、各従業員は彼/彼女に関連する1つ以上の証明書を持つことができると想定されています。証明書の関連情報を次の構造で別のテーブルに保存します。
テーブル証明書の作成(ID int not null auto_increment、certificate_type varchar(40)default null、certiferation_name varchar(30)デフォルトnull、employee_id int default null、primary key(id));
従業員と証明書オブジェクトの間には、1対多くの関係があります。
Pojoクラスを定義します:
従業員のテーブルにオブジェクトのコレクションを保持するために使用されるPOJOクラスの従業員と、証明書を持つリスト変数を実装しましょう。
import java.util。*; public class Employee {private int id;プライベート文字列firstName;プライベート文字列lastName;プライベート給与;プライベートマップ証明書。 public Employee(){} public Employee(string fname、string lname、int salary){this.firstname = fname; this.lastname = lname; this.salary = 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(){return Salary; } public void setSalary(int salary){this.salary = salary; } public Map getCertificates(){return empristates; } public void setCertificates(マップ証明書){this.certificates = emberates; }}別のPOJOクラスを定義するには、対応する証明書テーブルが必要です。このような証明書オブジェクトは、証明書テーブルを保存および取得できます。
パブリッククラス証明書{private int id;プライベート文字列名; public emperipation(){} public emperation(string name){this.name = name; } public int getId(){return id; } public void setid(int id){this.id = id; } public string getname(){return name; } public void setName(string name){this.name = name; }} Hibernateマッピングファイルを定義します。
データベーステーブルにマッピングされたクラスを定義する方法をHibernateに指示するマッピングファイルを開発しましょう。 <Map>要素は、使用されるマップのルールを定義するために使用されます。
<?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> <map name = "cascade =" all "> <key column =" employe _id "/> <index column =" certilection_type "typen name = "lastname" columm = "last_name" type = "string"/> <財産名= "salary" column = "salary" type = "int"/> </class> <class name = "emperist" table = "emperist"> <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がアイデンティティ、シーケンス、またはHILOのいずれかでアルゴリズムをピックアップして、基礎となるデータベースのサポート機能に従ってプライマリキーを作成します。
<property>要素は、Javaクラスのプロパティをデータベーステーブル内の列にマッピングするために使用されます。要素の名前属性は、属性のクラスを指し、列属性はデータベーステーブルの列を指します。型属性は、JavaからSQLデータ型に変換されるHibernateマッピングタイプを保存します。
<map>要素は、証明書と従業員クラスの関係を設定するために使用されます。 Cascade属性の<Map>要素を使用して、Hibernateに証明書オブジェクトを保存するように指示します。名前属性は、親クラスのMapVariable、この場合は証明書を定義するように設定されています。
<index>要素は、キーと値のキー/値のペアを表すために使用されます。このキーは、列certifertion_typeに保存されている文字列タイプを使用します。
<key>要素は、外部キー、つまり証明書テーブルの列を含む親オブジェクトです。テーブルの従業員。
<one-many>要素は、従業員オブジェクトに多くの証明書オブジェクトが含まれていることを示しているため、証明書オブジェクトは従業員の親クラスに関連している必要があります。必要に応じて、<1-one>、<on-on-one>、または<many-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(); / *最初の従業員の証明書のセットを用意しましょう */ hashmap set = new Hashmap(); set.put( "ComputerScience"、新しい証明書( "MCA")); set.put( "BusinessManagement"、新しい証明書( "MBA")); set.put( "ProjectManagement"、new証明書( "PMP")); / *データベースに従業員の記録を追加 */ integer empid = me.addemployee( "manoj"、 "kumar"、4000、set); / *すべての従業員をリストダウン */ me.listemployee(); / *従業員の給与記録を更新 */ me.updateemployee(empid、5000); / *すべての従業員をリストダウン */ me.listemployees(); } / *データベースに従業員レコードを追加する方法 * / public Integer addemployee(string fname、string lname、int salary、hashmap cert){session session = factory.opensession();トランザクションTx = null; Integer EmployeeID = null; try {tx = session.begintransaction();従業員=新しい従業員(fName、lname、給与); 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()); map ec = employee.getCertificates(); System.out.println( "certificate:" +((((((((証明書))ec))。getname()); system.out.println( "certifate:" +((((emperipation)ec.get( "businessmanagement"))。 (((証明書)ec.get( "ProjectManagement"))。getname())); e.printstacktrace();従業員(給与)。 session = tx = session() {session.close();コンパイルと実行:
上記のアプリケーションをコンパイルして実行する手順は次のとおりです。コンパイルして実行する前に、パスとクラスパスを適切に設定していることを確認してください。
次の結果は画面で得られ、記録は従業員と証明書フォームの両方で作成されます。
$ Java Managemployee
.....さまざまなログメッセージがここに表示されます.........
名:Manoj姓:Kumar Salary:4000Certificate:McAcertificate:Mbacertificate:PMPfirst Name:Manoj姓:Kumar Salary:5000Certificate:mbacertificate:pmp
従業員と証明書フォームを確認する場合は、次のことを記録する必要があります。
mysql> select * from Employee;
+------------------------------+------------+| ID | first_name | last_name |給与|+----------------------------------------+--------------+| 60 |マノジ|クマール| 5000 |+----------------------------------+--------+1列のセット(0.00秒)
mysql> select * from emperipation;
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
sortedmapマッピング
sortedMapは、キー価値ペアに保存された要素であり、マッピング用のJavaコレクションに似た全体的な種類のキーを提供します。マッピングでは、重複する要素が許可されていません。マップは、キーの自然な順序で、または通常、順序付けられたマップの作成時に比較を提供することにより並べ替えられます。
並べ替えられたマップがマッピングテーブルにマッピングされる<Map>要素と順序付けられたマップは、java.util.treemapで初期化できます。
上記のRDBMSテーブルとPojoクラスを使用して、次の例を説明します。
Hibernateマッピングファイルを定義します。
データベーステーブルにマッピングされたクラスを定義する方法をHibernateに指示するマッピングファイルを開発しましょう。 <Map>要素は、使用されるマップのルールを定義するために使用されます。
<?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> <map name = "cascade =" all "sort =" myclass "> <key column =" employee_id "/> <index column =" certifalent_type "type" type = "string"/> <on-many/> </> <propetial name "colum type = "string"/> <property name = "lastName" column = "last_name" type = "string"/> <プロパティ名= "給与" column = "salary" type = "int"/> </class> <class name "table =" emperiation "> <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>要素を使用して、プライマリキー値を自動的に生成します。生成された要素のクラス属性を設定して、アイデンティティ、シーケンス、またはHILOのアルゴリズムに対応する冬眠を作成して、基礎となるデータベースのサポート機能に従ってプライマリキーを作成します。
<property>要素は、Javaクラスのプロパティをデータベーステーブル内の列にマッピングするために使用されます。要素の名前属性は、属性のクラスを指し、列属性はデータベーステーブルの列を指します。型属性は、JavaからSQLデータ型に変換されるHibernateマッピングタイプを保存します。
<map>要素は、証明書と従業員クラスの関係を設定するために使用されます。 Cascade属性の<Map>要素を使用して、Hibernateに証明書オブジェクトを保存するように指示します。名前属性は、親クラスで定義されたsortedMap変数に設定されています。この場合、証明書です。ソートプロパティは、自然なソートに設定することも、java.util.comparatorとしてカスタムクラスの実装に設定することもできます。 java.util.comparatorとして実装するクラスMyclassを使用して、証明書クラスの実装の並べ替え順序を逆転させました。
<index>要素は、キー/値ペアマップの重要な部分を表すために使用されます。このキーは、列certifertion_typeに保存されている文字列タイプを使用します。
<key>要素は、外部キー、つまり証明書テーブルの列を含む親オブジェクトです。テーブルの従業員。
<one-many>要素は、従業員オブジェクトに多くの証明書オブジェクトが含まれていることを示しているため、証明書オブジェクトは従業員の親に関連付けられている必要があります。必要に応じて、<1-one>、<on-on-one>、または<many-many>を使用できます。
sort = "natural"を使用する場合、証明書クラスが比較可能なインターフェイスを実装し、hibernateがsortedmap()メソッドとして定義された証明書クラスで比較を使用しているため、個別のクラスを作成する必要はありません。ただし、マッピングファイルでカスタムコンパレータクラスMyClassを使用しているため、ソートアルゴリズムに基づいてこのクラスを作成する必要があります。マップで利用可能なキーソートをしましょう。
import java.util.comparator; public class myclass実装Comparator <string> {public int compare(string o1、string o2){final int before = -1; final int after = 1; / *並べ替え順序を逆にするには、複数の-1 */ if(o2 == null){return * -1; } comparable thiscertificate = o1;同等のthatcertificate = o2; if(thiscertificate == null){return * 1; } else if(thatcertificate == null){return * -1; } else {return thiscertificate.compareto(thatCertificate) * -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(); / *最初の従業員の証明書のセットを用意しましょう */ treemap set1 = new Treemap(); set1.put( "ComputerScience"、新しい証明書( "MCA")); set1.put( "BusinessManagement"、新しい証明書( "MBA")); set1.put( "ProjectManagement"、new証明書( "PMP")); / *データベースに従業員の記録を追加 */ integer empid1 = me.addemployee( "manoj"、 "kumar"、4000、set1); / * 2番目の従業員の別の証明書セット */ 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.deletemployee(empid2); / *すべての従業員をリストダウン */ me.listemployees(); } / *データベースに従業員レコードを追加する方法 * / public Integer addemployee(string fname、string lname、int salary、treemap cert){session session = factory.opensession();トランザクションTx = null; Integer EmployeeID = null; try {tx = session.begintransaction();従業員=新しい従業員(fName、lname、給与); 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()); sortedmap <string、certificate> map = employe.getCertificates(); for(map.entry <string、certificate> entry:map.entryset()){system.out.print( "/tcertificate type:" + entry.getKey()); system.out.println( "、name:" +(entry.getValue())。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(); }}}コンパイルと実行:
証明書が反対の順序でソートされていることがわかります。マッピングファイルを変更して試してみて、sort = "natural"を設定してプログラムを実行して、結果を比較してください。
$ Java Managemployee
.....さまざまなログメッセージがここに表示されます.........名:Manoj姓:Kumar給与:4000証明書タイプ:プロジェクト管理、名前:PMP証明書タイプ:名前:MCA証明書タイプ:MCA証明書タイプ:MCAマネージメント、名前:Mbafirst名:Dilip姓:Kumar給与:Kumar給与:3000証明書タイプ:Computerscience:MCA name:mcamanagemenation:manamanagement:manamanagement:manamanage 5000証明書タイプ:プロジェクト管理、名前:PMP証明書タイプ:ComputerScience、名前:MCA証明書タイプ:ビジネス管理、名前:MBA
従業員と証明書フォームを確認する場合は、次のことを記録する必要があります。
mysql> select * from Employee;
+---+---------------------+---------+| ID | first_name | last_name |給与|+--------------------------------------+-----------+------------+| 74 |マノジ|クマール| 5000 |+---------------------------------+--------+1列のセット(0.00秒)
mysql> select * from emperipation;
+-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------