セット
コレクションセットは、重複する要素を含まないJavaコレクションです。より正式には、SETにはE1.Equals(E2)、およびせいぜい1つの空の要素など、E1およびE2の要素は含まれていません。したがって、一連のオブジェクトに追加されると、Javaが2つの要素/オブジェクトが同じかどうかを判断できるように、equals()およびHashCode()メソッドを実装する必要があります。
セットはマップテーブルの<set>要素にマッピングされ、java.util.hashsetで初期化されます。セットコレクションを使用して、クラスを使用するときに繰り返す必要のない要素をコレクションに持っています。
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_name varchar(30)デフォルトnull、employee_id int default null、primary key(id));
多数の従業員と証明書オブジェクトとの間には関係があります。
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 set getCertificates(){return証明書; } public void setCertificates(set cidentate){this.certificates = ciptramtes; }}次に、テーブルに対応する別のPojoクラスの証明書を定義しましょう。そのような証明書オブジェクトは、証明書テーブルを保存して取得できます。また、このクラスは、Javaが2つの要素/オブジェクトが同じかどうかを判断できるように、同時にequals()とhashcode()メソッドを実装する必要があります。
パブリッククラス証明書{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; } public boolean equals(object obj){if(obj == null)return false; if(!this.getClass()。equals(obj.getclass()))return false;証明書obj2 =(証明書)obj; if((this.id == obj2.getid())&&(this.name.equals(obj2.getname())){return true; } falseを返します。 } public int hashcode(){int tmp = 0; tmp =(id + name).hashcode(); TMPを返します。 }} Hibernateマッピングファイルを定義します。
Hibernateがデータベーステーブルにマップするマッピングファイルを定義する方法を指定するマッピングファイルを開発しましょう。 <set>要素は、コレクションの設定に使用されるルールを定義するために使用されます。
<?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>要素を使用して、プライマリキー値を自動的に生成します。生成された要素のクラス属性を元の要素に設定して、ID、シーケンス、またはHILOアルゴリズムのいずれかを冬眠させて、基礎となるデータベースのサポート機能に従ってプライマリキーを作成します。
<property>要素は、Javaクラスのプロパティをデータベーステーブル内の列にマッピングするために使用されます。要素の名前属性は、属性のクラスを指し、列属性はデータベーステーブルの列を指します。型属性は、JavaからSQLデータ型に変換されるHibernateマッピングタイプを保存します。
<set>要素は新しく、証明書と従業員クラスの関係を設定するために導入されました。 Cascade属性の<set>要素を使用して、Hibernateに証明書オブジェクトと従業員オブジェクトを保存するように指示します。名前属性は、親クラスの定義の変数を設定するように設定されています。この場合、証明書です。変数のセットごとに、マッピングファイルに個別の要素セットを定義する必要があります。
<key>要素は、外部キー、つまり証明書テーブルの列を含む親オブジェクトです。テーブルの従業員。
<one-many>要素は、従業員オブジェクトに多くの証明書が含まれていることを示しているため、証明書オブジェクトは親従業員に関連している必要があります。必要に応じて、任意のおよび<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(); / *最初の従業員のための一連の証明書を作成しましょう */ 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;
+---+-----------------+-------------+| ID | certificate_name | employee_id |+----+----------------+------------+| 1 | MBA | 1 || 2 | PMP | 1 || 3 | MCA | 1 |+----+-----------------+------------+3行セット(0.00秒)
mysql>
sortedset
sortedsetは、使用する重複した要素と要素を含まないJavaコレクションで、自然な順序を提供するか、コンパレータによってソートされます。
マッピングテーブル<set>要素とjava.util.treesetで初期化されたソートセットマップ。ソート属性は、コンパレータまたは自然な順序に設定できます。自然な順序が使用される場合、そのイテレーターは昇順で配置された設定要素を通過します。
上記の例で定義されているRDBMSテーブルを引き続き使用しており、複数の従業員と証明書オブジェクトの間に関係があり、POJOクラスも上記で定義されています。
POJOクラスの従業員を実装して、従業員のテーブルにオブジェクトのコレクションを保持するために使用されます。
ここで、証明書テーブルに対応する別のPOJOクラスの証明書を定義しましょう。そのような証明書オブジェクトは、証明書テーブルを保存して取得できます。このクラスは、比較可能なインターフェイスも実装する必要があり、比較方法を使用して、ファイルをマッピングする場合(以下のマップファイルを参照)sort = "natural"を設定します。要素はソートされます。
パブリッククラスの証明書を実装して、比較可能<証明書> {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; } public int compareto(証明書){final int before = -1; final int after = 1; if(that == null){前に戻ります。 } comparable thisCertificate = this.getName();同等のthatcertificate = thit.getName(); if(thiscertificate == null){return after; } else if(thatCertificate == null){return fore; } else {return thiscertificate.comPareto(thatCertificate); }}} Hibernateマッピングファイルを定義します。
Hibernateがデータベーステーブルにマップするマッピングファイルを定義する方法を指定するマッピングファイルを開発しましょう。 <set>要素を使用して、使用されるsortedsetコレクションのルールを定義します。
<?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 =" alt "sort =" myclass "> <key column =" employee_id "/> <on-many/> </set> <プロパティname =" firstname = "first_name" "/<列= "last_name" type = "string"/> <プロパティ名= "salary" column = "salary" type = "int"/> </class> <class name = "emperiation"> <meta属性= "class-description">このクラスには証明書記録が含まれます。 </meta> <id name = "id" type = "int" column = "id"> <generator/> </id> <プロパティname = "name" column = "certilement_name" typen
Map Fileの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マッピングタイプを保存します。
<set>要素は、証明書と従業員クラスの関係を設定するために使用されます。 Cascade属性の<set>要素を使用して、Hibernateに証明書オブジェクトを保存するように指示し、従業員オブジェクトにも伝えます。名前属性は、親クラスで定義された並べ替えセットの変数に設定されています。この場合、証明書です。ソートプロパティは、自然なソートに設定することも、java.util.comparatorとしてカスタムクラスの実装に設定することもできます。 java.util.comparatorとして実装するクラスMyclassを使用して、証明書クラスの実装の並べ替え順序を逆転させました。
<key>要素は、外部キー、つまり証明書テーブルの列を含む親オブジェクトです。テーブルの従業員。
<one-many>要素は、従業員オブジェクトに多くの証明書オブジェクトが含まれていることを示しているため、証明書オブジェクトは親従業員に関連している必要があります。必要に応じて、任意のおよび<1対1>、<多>、または<多くのマニュ>要素を使用できます。
sort = "natural"設定を使用する場合、証明書クラスが比較可能なインターフェイスを実装し、hibernateが比較(証明書クラスの比較証明書名として定義)を使用しているため、個別のクラスを作成する必要はありません。ただし、マッピングファイルでカスタムコンパレータクラスMyclassを使用しているため、ソートアルゴリズムに基づいてこのクラスを作成する必要があります。このクラスを使用して、降順で並べ替えます。
Import Java.util.comparator; public class myclass emplements comparator <certificate> {public int compare(certificate o1、certificate o2){final int before = -1; final int after = 1; / *並べ替え順序を逆にするには、複数の-1 */ if(o2 == null){return * -1; } comparable thiscertificate = o1.getname();同等のthatcertificate = o2.getname(); 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(); / *最初の従業員の証明書のセットを用意しましょう */ treeset set1 = new Treeset(); 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番目の従業員の別の証明書のセット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、sortedset 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()); sortedset証明書= 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(); }}}コンパイルして実行すると、次の結果が画面上で取得され、レコードは従業員と証明書表の両方に作成されます。証明書が反対の順序でソートされていることがわかります。マッピングファイルを変更して試してみて、sort = "natural"を設定してプログラムを実行して、結果を比較してください。
$ Java Managemployee
.....さまざまなログメッセージがここに表示されます.........名:Manoj姓:Kumar給与:4000certificate:mcAcertificate:mbafirst Name:dilip last Name:Kumar Salary:3000certificate:bcacertifificate:bafirst name:manoj last:kumar salary:pmpcactificatet
従業員と証明書フォームを確認する場合は、次のことを記録する必要があります。
mysql> select * from Employee;
+----------------------------+----------+| ID | first_name | last_name |給与|+--------------------------------------+-----------+-----------+| 1 |マノジ|クマール| 5000 |+---------------------------------+--------+1列のセット(0.00秒)
mysql> select * from emperipation;
+---+-----------------+-------------+| ID | certificate_name | employee_id |+----+----------------+------------+| 1 | MBA | 1 || 2 | PMP | 1 || 3 | MCA | 1 |+----+-----------------+------------+3行セット(0.00秒)