複合プライマリキーマッピングには、マッピング構成ファイルで<composite-id>タグを使用する必要があります。このタグとは、クラスを対応する複合プライマリキーとして指定することを指します。その名前属性は、クラスファイルで定義されているプロパティ値を指定し、<key-property>サブラベルをタグに追加する必要があります。
注:複合マッピングを使用する場合は、複合プライマリキーを1つのクラスに配置する必要があります。つまり、複合プライマリキー属性とその他の属性が2つのクラスに分割され、複合プライマリキークラスはjava.ioに属するインターフェイスシリアル化可能なものを実装します。
複合プライマリキーのマッピング関係の主要なキーは、下の図に示すように、非常に単純なデータテーブルに対応する複数の列で構成されています。
1。クラスファイル
ここでは、上記の図のテーブルを例として取ります。テーブルでは、2つのフィールドと期間が組み合わさってテーブルの主要な鍵を形成します。したがって、分割された新しいクラスは、それぞれFiscalyearperiodとfiscalyearperiodpkと名付けられています。その中で、Fiscalyearperiodクラスは、テーブルの主要な属性をカプセル化します。FiscalyearperioDクラスは、他の属性と財政大部分のクラスをカプセル化します。
1.1 fiscalyearperiod.java
クラスは基本的なプロパティをカプセル化し、fiscalyearperioDPKクラスをクラスへの属性としてカプセル化し、次のように構成ファイルに対応するマッピングを構成します。
パッケージcom.src.hibernate; java.sql.dateをインポートします。 Public Class FiscalyearPeriod {// Time Primary Key Private fiscalyearperiodpk fiscalyearperiodpk; public fiscalyearperiodpk getfiscalyearperiodpk(){return fiscalyearperiodpk; } public void setfiscalyearperiodpk(fiscalyearperiodpk fiscalyearperiodpk){this.fiscalyearperiodpk = fiscalyearperiodpk; } //プライベートデートを開始します。 public date getBegindate(){return begindate; } public void setbegindate(date begindate){this.begindate = begindate; } //プライベート日付終了日の終了enddate; public date getEnddate(){return enddate; } public void setenddate(date enddate){this.enddate = enddate; } //ステージタイムプライベート文字列時代; public String getPerioDSTS(){return cisepionsts; } public void setPerioDSTS(string civeringsts){this.periodsts = rigionsts; }} 1.2 fiscalyearperiodpk.java
主キー属性をカプセル化します。このクラスは、財政大部分クラスから分離されています。基本的なプライマリキー属性が含まれており、インターフェイスシリアル化可能なものを実装する必要があります。このクラスは、Configurationファイルの<composite-id>タグにマッピングして、クラスを指定します。コードは次のとおりです。
パッケージcom.src.hibernate; java.io.serializableをインポートします。 Public Class FiscalyearPerioDPKは、Serializable {// year private int fiscalyear; public int getFiscalyear(){return fiscalyear; } public void setfiscalyear(int fiscalyear){this.fiscalyear = fiscalyear; } //持続時間private int fiscalperiod; public int getFiscalPeriod(){return fiscalperiod; } public void setfiscalperiod(int fiscalperiod){this.fiscalperiod = fiscalperiod; }} 2。構成ファイル
2つのクラスのうち、マッピングファイルを追加する必要があるのはどれですか? <composite-id>タグが使用されるため、Fiscalyearperiodクラスのマッピングを追加し、対応する複合プライマリキータグをマッピングファイルに追加し、次のように対応するプライマリキー属性をタグに追加するだけです。
<?xml version = "1.0"?> <!doctype hibernate-mapping public " - // hibernate/hibernateマッピングDTD 3.0 // en" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> name = "com.src.hibernate.fiscalyearperiod" table = "t_fiscal_year_period_pk"> <composite-id name = "fiscalyearpk"> <key-property name = "key-property name =" name = "begindate" type = "date"/> <property name = "enddate" type = "date"/> <プロパティ名= "enddate" type = "date"/> <プロパティname = "periodsts"/> </class> </hibernate-mapping> <
上記のファイルは、対応するデータベーステーブルを生成するために生成され、生成されたSQLステートメントは次のとおりです。
テーブルをドロップする場合はt_fiscal_year_period_pk Create Table t_fiscal_year_period_pk(nullではなく、財政整数、fiscalperiod Integer not noll、null、begindate Date、enddate Date、Periodsts Varchar(255)、Primary Key(fiscalyear、fiscalperiod)))
対応するテーブル構造は次のとおりです。
3。データ操作
対応するマッピングファイルが構成された後、対応するデータ操作が非常に簡単になります。まず、データの作成から始めます。データベースにデータを書き込むと、2つのクラスが同時にデータベースに書き込まれます。したがって、両方のクラスを一時的な状態に変換する必要があります。したがって、保存するときは、最初にFiscalyearperioDオブジェクトを最初にデータベースに保存する必要があります。次に、複合属性を自動的に関連付けてデータベースに保存します。
3.1書き込み操作
書き込み操作方法は、以前の書き込み方法と同じです。 2つのオブジェクトを定義し、対応するオブジェクト情報をデータベースに保存する必要があります。コードは次のとおりです。
public void testsave1(){//セッションオブジェクトセッションセッション= nullを宣言します。 try {//セッションオブジェクトセッション= hibernateutils.getSession()を取得します; //セッションセッションを開きます。begintransaction(); // compositeオブジェクトの作成fiscalyearperiodpk fiscalyearperiodpk = new fiscalyearperiodpk(); fiscalyearperiodpk.setfiscalperiod(2014); fiscalyearperiodpk.setfiscalyearyear(2012); //オブジェクトの作成fiscalyearperiod fiscalyearperiod = new fiscalyearperiod(); fiscalyearperiod.setfiscalyearperiodpk(fiscalyearperiodpk); session.save(fiscalyearperiod); //セッションセッションセッションを送信します。getTransaction()。compid(); } catch(Exception e){e.printstacktrace(); session.getTransaction()。rollback(); }最後に{hibernateutils.closessession(session); }}対応するテスト方法を実行すると、生成されたSQLステートメントは次のとおりです。
Hibernate: insert into t_fiscal_year_period_pk (beginDate, endDate, periodSts, fiscalYear, fiscalPeriod) values (?, ?, ?, ?, ?)対応するデータベースビュー:
3.2荷重操作
テーブルの主要なキーは複合特性であるため、クラスを作成する必要があるため、対応する荷重方法は以前とは異なります。データをロードするときは、主要なキーオブジェクトを作成する必要があります。この時点で、主キーはオブジェクトであり、オブジェクトを取得するためにオブジェクトのプロパティに値を割り当てる必要があります。コードは次のとおりです。
public void testload1(){//セッションオブジェクトセッションセッション= nullを宣言します。 try {//セッションオブジェクトセッション= hibernateutils.getSession()を取得します; //セッションセッションを開きます。begintransaction(); // compositeオブジェクトの作成fiscalyearperiodpk fiscalyearperiodpk = new fiscalyearperiodpk(); fiscalyearperiodpk.setfiscalperiod(2014); fiscalyearperiodpk.setfiscalyear(2012); Fiscalyearperiod fiscalyearperiod =(fiscalyearperiod)session.load(fiscalyearperiod.class、fiscalyearperiodpk); system.out.println( "start date:"+fiscalyearperiod.getbegindate()); // SESSION SESSION.GETTRANSACTION()。COMVED()を送信します。 } catch(Exception e){e.printstacktrace(); session.getTransaction()。rollback(); }最後に{hibernateutils.closessession(session); }}結果は次のとおりです。
Hibernate:fiscalyear0_.fiscalyears asfiscalyear0_0_、fiscalyear0_.fiscalperiodはfiscalpe2_0_0_、fiscalyear0.begindate begindate0_0_、fiscalyear0_.enddate as enddate0_0_0_0_0__0_ T_FISCAL_YEAR_PERIOD_PK FISCALYEAR0_ WHERE FISCALYEAR0_.FISCALYEAR =?およびfiscalyear0_.fiscalperiod =?開始日:2013-10-12
4。包括的な例
大企業(hibernate_dept_compositepk)の部門テーブルは、エリア(エリア)、部門名(名前)、部門の人数(empcount)、および設立時間(誕生日)などのフィールドで構成されています。エリアと部門名を共同主キーとして使用します。
4.1ターゲットクラス:Department.java
パブリッククラス部門{ /**要約プライマリキーアソシエーションの属性を別々にクラスに書き込みます* ///プライベートストリングエリア。 //プライベート文字列名; / **メンバー変数としてプライマリキークラスオブジェクトを準備*/ private departmentpk departmentPk。 Private Int Empcount;プライベートデートの誕生日; // public string getarea(){// return領域; //} // // public void setarea(string area){// this.area =領域; //} // // public string getname(){// return name; //} // // public void setname(string name){// this.name = name; //} public int getempcount(){return empcount; } public void setempcount(int empcount){this.empcount = empcount; } public date getBirthday(){return Birthday; } public void setbirthday(date Birthday){this.birthday = Birthday; } public departmentpk getDepartmentPk(){return departmentpk; } public void setDepartmentpk(departmentPk digtimincepk){this.departmentpk = departmentpk; }} 4.2プライマリキークラス:departmentpk.java
Public Class DepartmentPkはSerializable {private static final long serialversionuid = -28855915204255l;プライベートストリングエリア。プライベート文字列名; /** *ハッシュコードメソッドを上書き(領域と名前に基づいて審査) int result = 1; result = prime * result +((area == null)?0:area.hashcode()); result = prime * result +((name == null)?0:name.hashcode());返品結果; } / ** *上書き(領域と名前に基づいて判断) if(obj == null)falseを返します。 if(getClass()!= obj.getClass())falseを返します。最終demayppk other =(departmentpk)obj; if(area == null){if(other.area!= null)falseを返します。 } else if(!area.equals(other.area))falseを返します。 if(name == null){if(other.name!= null)return false; } else if(!name.equals(other.name))false; trueを返します。 } public string getarea(){return領域; } public void setarea(文字列領域){this.area =領域; } public string getname(){return name; } public void setName(string name){this.name = name; }} 4.3マッピングファイル部門。hbm.xml
<?xml version = "1.0"?> <!doctype hibernate-mapping public " - // hibernate/hibernateマッピングDTD 3.0 // en" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> name = "com.yangfei.hibernate.compositepk.entity.department" table = "hibernate_dept_compositepk"> <! - union primary key-> <! - 名前はプライマリキーオブジェクト属性を指します - > <composite-id name = "departmentpk"> <! name = "name" /> < /composite-id> <! - その他のプロパティ - > <プロパティname = "empcount" length "length =" 4 " /> <property name =" barthined "type =" date " /> < /class> < /hibernate-mapping>
4.4 Hibernate構成ファイルhibernate.cfg.xml
<?xml version = '1.0' encoding = 'utf-8'?> <!doctype hibernate-configuration public " - // hibernate/hibernate構成 - > <hibernate-configuration> <session-factory> <プロパティ名= "dialect"> org.hibernate.dialect.oracle9dialect </property> <Property name = "connection.url"> jdbc:thin:shin:@127.0.0.1:1521:ORCL10 < name = "connection.password"> yf123 </property> <property name = "connection.driver_class"> oracle.jdbc.driver.oracledriver </property name> <property name = "hibernate.show_sql" </session-factory> </hibernate-configuration>
4.5テストクラス:departmenttest.java
public class departmenttestはtestcase { / ***データの挿入データ* / public void save(){session session = hibernateutils.getSession();トランザクションt = session.begintransaction(); try {Department dept = new Department(); / **プライマリキーオブジェクトを生成*/ departmentpk deptpk = new DepartmentPk(); deptpk.setarea( "Beijing"); deptpk.setName( "R&D Department"); dept.setDepartmentPk(deptpk); Dept.setempcount(100); dept.setbirthday(new Date()); session.save(dept); T.commit(); } catch(hibernateException e){e.printstacktrace(); t.rollback(); }最後に{hibernateutils.closessession(session); }} / ***テストロードデータ* / public void load(){session session = hibernateutils.getSession();トランザクションt = session.begintransaction(); try { / **プライマリキーオブジェクトを生成* / departmentpk deptpk = new DepartmentPk(); deptpk.setarea( "Beijing"); deptpk.setName( "R&D Department"); Department dept =(department)session.load(department.class、deptpk); system.out.println(dept.getDepartmentPk()。getarea()+"、"+dept.getDepartmentpk()。getName()+"、"+dept.getempcount()+"、"+dept.getBirthday()); } catch(hibernateException e){e.printstacktrace(); t.rollback(); }最後に{hibernateutils.closessession(session); }} / ***テスト修正データ* / public void update(){session session = hibernateutils.getSession();トランザクションt = session.begintransaction(); try { / **プライマリキーオブジェクトを生成* / departmentpk deptpk = new DepartmentPk(); deptpk.setarea( "Beijing"); deptpk.setName( "R&D Department");部門EMP =(部門)session.load(department.class、deptpk); system.out.println(emp.getDepartmentPk()。getarea()+"、"+emp.getDepartmentpk()。getName()+"、"+emp.getempcount()+"、"+emp.getBirthday()); emp.setempcount(100); session.saveorupdate(emp); / **プライマリキーオブジェクトを生成*/ departmentpk deptpk2 = new DepartmentPk(); deptpk2.setarea( "Beijing"); deptpk2.setname( "R&D Department");部門部門=(部門)session.load(department.class、deptpk2); system.out.println(dept.getDepartmentPk()。getarea()+"、"+dept.getDepartmentpk()。getName()+"、"+dept.getempcount()+"、"+dept.getBirthday()); T.commit(); } catch(hibernateException e){e.printstacktrace(); t.rollback(); }最後に{hibernateutils.closessession(session); }} / *** DELETE DELETE DATE* / public void delete(){session session = hibernateutils.getSession();トランザクションt = session.begintransaction(); try { / **プライマリキーオブジェクトを生成* / departmentpk deptpk = new DepartmentPk(); deptpk.setarea( "Beijing"); deptpk.setName( "R&D Department"); Department dept =(department)session.load(department.class、deptpk); session.delete(dept); T.commit(); } catch(hibernateException e){e.printstacktrace(); t.rollback(); }最後に{hibernateutils.closessession(session); }}}