1。1対多くの一元配置マッピング
1対多くの関係のオブジェクトモデルは、日常生活でよく見られます。例として学生とクラスを取ります。クラスには複数の学生がいるため、クラスと学生の関係は、下の図に示すように、オブジェクトモデルにマッピングされた1対多数の関係です。
オブジェクトモデルは、この1対多数の関係が一方の端によって維持されていることを示しているため、関係モデルにマッピングすると、クラスフィールドの下に複数の学生がいることを意味し、1対多くの関係が形成されます。学生情報はクラスを通じて取得できます。対応する関係モデルは次のとおりです。
1。基本的な構成
オブジェクトモデルを使用して、それらを対応する関係コードにマッピングします。関係マッピングを実行するときは、一方の端に<1対多>タグを追加する必要があります。さらに、一端に設定属性を追加する必要があります。怠zyなロードをサポートし、マッピングファイルにセットタグを追加し、1対多数の関係を指定して、一方の端で複数の端を取得できるようにします。
クラスとマッピングファイル:
それはモデルの最も重要な終わりです。この目的で、対応するセット属性を追加し、構成ファイルにセットタグを追加する必要があります。セットタグで対応する<one-many>オブジェクトを構成できます。特定のclasses.javaオブジェクトコードは次のとおりです。
パッケージcom.src.hibernate; java.util.setをインポートします。パブリッククラスクラス{private int id; 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; }プライベート文字列名; // SETは、プライベートセットの学生の怠zyなロードをサポートします。 public set getStudents(){return sustent; } public void setStudents(set desustor){this.students = desustor; }}セット属性はクラスオブジェクトで使用されますが、遅延荷重属性を説明するだけで、属性の対応するオブジェクトを構成しません。属性のオブジェクトは、マッピングファイルで構成する必要があります。セットタグを追加し、<1対多>タグをセットタグに追加する必要があります。特定のコードは次のとおりです。
<?xml version = "1.0"?> <!doctype hibernate-mapping public " - // hibernate/hibernateマッピングDTD 3.0 // en" "http://hibernate.sourceforge.net/hibernate-mapting-3.0.dtd"テーブル= "T_CLASSES"> <id name = "id"> <generator // id> <プロパティ名= "name"/> <set name = "desunts"> <key column = "classid"> </key> <1-many> </one-many> </set> </class> </hibernate-mapping>
対応する学生オブジェクトのコードファイルとマッピングファイルは、特別な構成を必要とせず、通常のライティング方法に従って記述するだけです。特定の構成方法は詳細に説明されておらず、非常に簡単です。構成後、対応するSQLステートメントを生成する必要があります。オブジェクトモデルをリレーショナルモデルに変換する場合、hibernateは次のように対応するステートメントを生成します。
テーブルT_STUDENTドロップ外部キーFK4B9075705E0フェフェフェフドロップテーブルT_CLASSESドロップテーブルが存在する場合、T_STUDENT CREATEテーブルT_CLASSES(ID integer Not Notl Auto_increment、Name Varchar(255)、Primary Key(ID))Create Table T_Student(ID integer not integer integer(255)プライマリキー(ID))ALTER TABLE T_STUDENT ADD INDEX FK4B9075705E0AFEFE(ClassID)、Constraint FK4B9075705E0AFEFE外部キー(classesID)参照T_CLASSES(ID)
生成された対応する関係モデルを以下に示します。
SQLステートメントと関係モデルを比較すると、対応するテーブル間の関連性は、外部キーを介して維持されます。まず、2つのテーブルを作成し、テーブルの主要なキーを指定し、最後に1対多くの外部キー関連関係を追加します。
2。基本操作
データベースの操作は読み取りと書き込みに過ぎず、変更は書き込みの一種でもあります。次に、データベースに操作を書き込み、読み取る方法を見てみましょう。
(1)データの書き込み:
データを書くときは、1対多数の関係に注意を払う必要があるため、複数の学生クラスを追加するときは複数の学生クラスを追加する必要があります。さらに、対応するセット属性がクラスに追加されるため、ハッシュセットを使用して生徒のオブジェクトを追加するときに追加する必要があります。特定のコードは次のとおりです。
public void testsave2(){session session = null; try {session = hibernateutils.getSession(); session.begintransaction(); Student Student1 = new Student(); Student1.setName( "Zhangsan"); SESSION.SAVE(sustent1); Student Student2 = new Student(); Student2.setName( "lisi"); session.save(desute2);クラスクラス= new Classes(); classes.setname( "classone"); set instound = new Hashset(); desustor.add(sustent1); desustor.add(desutent2); classes.setStudents(学生); //データは正常に保存できます//しかし、それは1対多くの理由であるため、関係を維持するために追加の更新ステートメントが発行されます。 session.getTransaction()。commive(); } catch(Exception e){e.printstacktrace(); session.getTransaction()。rollback(); }最後に{hibernateutils.closessession(session); }}次に、上記のテストケースを実行して生成された対応するデータがデータベースに書き込まれた後、次の図は次のとおりです。
(2)データを読む:
書き込み操作は比較的簡単です。すべてのロードされたオブジェクトを過渡状態に追加し、対応するメソッドを実行してコンテンツを挿入するだけです。ただし、対応する読み取り操作はもう少し複雑になります。すべての学生オブジェクトを取得するために反復する必要があるため、この1対多くの関係はあまり効率的ではありません。特定のコードは次のとおりです。
パッケージcom.test.hibernate; java.util.iteratorをインポートします。 java.util.setをインポートします。 com.src.hibernate。*; junit.framework.testcaseをインポートします。 org.hibernate.sessionをインポートします。 public class one2manytestはtestcaseを拡張します{public void testload1(){session session = null; try {session = hibernateutils.getSession(); session.begintransaction(); //プライマリキー5クラスクラスでクラス情報を取得=(classes)session.load(class.class、5); //クラス情報System.out.println( "classes.name ="+classes.getname()); //学生セットを設定し、クラスセットを介して学生セットをロードします= class.getStudents(); //セットを繰り返し、セットの学生情報を印刷します(iterator iter = sustent.iterator(); iter.hasnext();){desute dustent =(desutent)iter.next(); system.out.println( "sustent.name ="+desudent.getname()); } session.getTransaction()。compid(); } catch(Exception e){e.printstacktrace(); session.getTransaction()。rollback(); }最後に{hibernateutils.closessession(session); }}}生成される対応するステートメントと情報は次のとおりです。
hibernate:classes0_.idをid1_0_として選択し、classes0_.name as name1_0_ from t_classes classes0_ where classes0_.id =? classes.name = classone hibernate:select students0_.classidはclassid1_、sustents0_.id as id1_、sustents0_.id as id0_0_、sudents0_.name as name0_0_ as t_student sustent0_ Student.name = lisi sustent.name = Zhangsan
2。1対多様な双方向のマッピング
ここでは、学生とクラスを例として使用し続けています。クラスと学生の間には1対多い関係があります。クラスには複数の学生がいます。前の記事とは異なり、ここでの関係は双方向です。つまり、一方の端と一方の端が同時に関係を維持するため、そのオブジェクト図は次のとおりです。
対応する関係モデル図はあまり変化しません。それらの間の関係は双方向であるため、関係モデルの両端は同時に関係関係を維持し、以下の図に示すように関係モデルにマッピングします。
1対多くの一方向の関連性では、マッピングファイルは一端に特別に構成するだけでいいものがあります。 <1対多>構成を使用し、オブジェクトモデルのセットイテレーターを使用して、アウトリンクオブジェクトモデルを設定します。ただし、違いは、双方向の関連付けでは、反対側の対応する外部キー関連を複数端に追加する必要があることです。現時点では、この双方向性を示すために、<多端>の関係を複数の端で使用する必要があります。
1。マッピング
クラスと学生もここで例として使用されます。クラスの端のコンテンツは上記と同じであり、変更されませんが、複数の端での生徒の構成が変更されます。つまり、マッピングファイルに<多面対1>タグを追加する必要があります。
Student.hbm.xmlマッピングファイルの構成には、外部キー列<buly-one-one>タグを追加する必要があり、列の名前はclasses.hbm.xmlの外部キー列の名前と一致する必要があります。特定のコードは次のとおりです。
<?xml version = "1.0"?> <!doctype hibernate-mapping public " - // hibernate/hibernateマッピングDTD 3.0 // en" "" http://hibernate.sourceforge.net/hibernate-mapting-3.0.dtd "テーブル= "t_student"> <id name = "id"> <generator/generator/> </id> <プロパティ名= "name"/> <! - 列名はclasses.hbm.xmlのリストと同じである必要があります。
classes.hbm.xmlマッピングファイルの構成は、前の記事と同じです。 SET属性マッピングがclasses.javaファイルに追加され、学生オブジェクトに対応することに注意する必要があります。したがって、セットタグをマッピングファイルに追加して、セットイテレータがオブジェクトモデルで使用されていることを示す必要があります。特定の構成は次のとおりです。
<?xml version = "1.0"?> <!doctype hibernate-mapping public " - // hibernate/hibernateマッピングDTD 3.0 // en" "http://hibernate.sourceforge.net/hibernate-mapting-3.0.dtd">テーブル= "t_classes"> <id name = "id"> <generator // id> <プロパティ名= "name"/> <set name = "inverse" inverse = "true =" true "> <key column =" classid "> </key> </key> </key> </no-many> </set> </class> </hibernate-mapping> </
2。クラス
マッピングファイルの構成はクラスに直接対応するため、マッピングファイルを使用すると、対応するクラスを記述できます。同じクラスでは、対応するマッピングファイルの書き込み方法を知ることができます。対応するクラスコードの書き方を見てみましょう。
Student.javaクラスでは、関連するクラスオブジェクト属性をクラスに追加する必要があり、学生を読み込むときにクラス関連情報を取得できます。
パッケージcom.src.hibernate;パブリッククラスの学生{//関連するクラスオブジェクトプライベートクラスクラス。 public classes getClasses(){return classes; } public void setClasses(クラスクラス){this.classes = classes; } // Student ID Private int id; 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; }} classes.javaファイルの特定のコードコンテンツは前の記事に示されており、ここでは詳しく説明しません。
オブジェクトモデルでは、関係モデルが生成されます。生成されたSQLステートメントは次のとおりです。
テーブルT_STUDENTドロップ外部キーFK4B907570FC588BF4ドロップテーブルT_CLASSESドロップテーブルが存在する場合、T_STUDENT CREATEテーブルT_CLASSES(null auto_increment、null auto_increment、name varchar(255)、primary key(id)create t_student(null aid aut_idcretent)create t_student(id integer_idce)create t_student整数、プライマリキー(ID))ALTER TABLE T_STUDENT ADD INDEX FK4B907570FC588BF4(ClassID)、Constraint FK4B907570FC5888BF4外部キー(ClassiSID)参照T_CLASSES(ID)
3。データ操作
テーブル構造を確立した後、データの操作を検証するテスト方法を書きました。まず、データの挿入を見て、テーブル構造にデータを挿入しましょう。データを書くときに2つの状況があります。 1つは、最初にクラスオブジェクトを作成し、データベースにオブジェクトを作成し、学生オブジェクトを作成し、クラスオブジェクトに学生オブジェクトを追加することです。もう1つは、最初に学生オブジェクトを作成し、学生オブジェクトをデータベースに作成し、クラスオブジェクトを作成してクラスオブジェクトに学生オブジェクトを追加することです。これらの2種類の操作は最終的に異なりますので、比較してみましょう。
3.1最初にクラスを書いてから生徒を書きます
最初にデータベースにクラスを書き込んだ後、クラスオブジェクトは過渡状態に入り、データベースに行があります。次に、学生オブジェクトを書きます。学生オブジェクトは、対応するクラスのプライマリキーを探し、それをテーブルに書き込みます。したがって、関係モデルのデータは空ではなく、保存されたコードは次のとおりです。
public void testsave(){session session = null; try {//セッションオブジェクトセッション= hibernateutils.getSession(); //トランザクションsession.begintransaction()を開きます。 //クラスオブジェクトを作成し、データベースクラスにクラスオブジェクトを書き込み= newクラス(); classes.setname( "class"); session.save(classes); //学生の1つのオブジェクトを作成し、学生オブジェクトをデータベースに書き込み、学生学生1 = new Student(); Student1.setName( "Zhangsan"); Student1.setClasses(クラス); SESSION.SAVE(sustent1); //学生2オブジェクトを作成し、学生オブジェクトをデータベースに書き込む学生2 = new Student(); Student2.setName( "lisi"); Student2.setClasses(クラス); session.save(desute2); session.getTransaction()。commive(); } catch(Exception e){e.printstacktrace(); session.getTransaction()。rollback(); }最後に{hibernateutils.closessession(session); }}書き込みデータベースの対応する情報リストは次のとおりです。
3.2最初に生徒を書き、次にクラスを書きます
まず、生徒をデータベースに書き込みます。この時点で、学生テーブルは対応するクラス列の主要な重要な情報を取得する必要があるため、クラス情報は一時的な状態に変換されるため、学生情報を書くときにヌル値があります。コードは次のとおりです。
記述後の対応するデータベースビューは次のとおりです。
2つの書き込み操作を比較すると、2つの書き込みの順序が異なるため、異なる結果が表示されますが、双方向の関連性であるため、執筆中に例外は発生しません。
4.操作を読む
データの作成と比較して、読み取りデータは非常に簡単になります。それは双方向の関連であるため、データの読み取りも双方向です。次のコードに示すように、もう一方の端からの情報は、任意の端から読むことができます。
public void testload1(){session session = null; try {session = hibernateutils.getSession(); session.begintransaction(); //クラスクラスを通じて学生情報を読むclasses =(classes)session.load(class.class、1); System.out.println( "classes.name ="+classes.getName());学生= classes.getStudents()を設定します。 for(iterator iter = sustent.iterator(); iter.hasnext();){desute sustent =(desute)iter.next(); system.out.println( "sustent.name ="+desudent.getname()); } //学生情報を介してクラス情報を読む学生stu = new Student(); stu =(desute)session.load(susteant.class、1); System.out.println( "学生クラスを介してクラス情報を読み込みます。id="+stu.getclasses()。getId()); session.getTransaction()。commive(); } catch(Exception e){e.printstacktrace(); session.getTransaction()。rollback(); }最後に{hibernateutils.closessession(session); }}上記のテストステートメントを実行し、生成された対応するステートメント情報は次のとおりです。
hibernate:classes0_.idをid1_0_として選択し、classes0_.name as name1_0_ from t_classes classes0_ where classes0_.id =? classes.name = class hibernate:select susteent0_.classesid as ClassId1_、sustents0_.id as dustents0_.id as id0_0_、sudents0_.name as name0_0_、sustentid0_0_ as classid0_0_ as t_student dustent0_ where where where?classesid =? Student.name = lisi sustent.name = Zhangsan
学生クラスによるクラス情報の読み込み。ID= 1