ORMフレームワークとして、Hibernateは、テーブル間の関連性を実装するためのニーズも満たさなければなりません。 AssociationメソッドでのHibernateの実装は非常に簡単です。一対一のアプローチを見てみましょう。
これ以上苦労せずに、コードをアップロードしましょう。
TuserとTpassportの2つのエンティティクラス:
パブリッククラスのチューザーは、シリアル化可能な{private static final long serialversionuid = 1l; private int id;プライベートインクエイジ;プライベート文字列名;プライベートTPassportパスポート。 // Get/Set MethodをOMIT} public class tpassport Implesments serializable {private static final long serialversionuid = 1l; private int id;プライベート文字列シリアル; private int expiry;プライベートチューザーユーザー。 // get/set method}ファイルのマッピングの違いを見てみましょう。
<hibernate-mapping package = "org.hibernate.tutorial.domain4"> <class name = "tuser" table = "user4"> <id name = "id" column = "generator/> </id> <property name =" name "type" type = "java.lang.string" column = "name"/> <propert name = "" java. column = "age"/> <on-one name = "passport" cascade = "all" outour-join = "true"/> </class> </hibernate-mapping>
ここでは、1対1の新しいレーベルが表示されます。これは、現在のクラスと対応するクラスが1対1であり、カスケードがカスケード関係であることを示しています。すべては、いずれにせよ、カスケードが実行されることを示しています。つまり、Tuserクラスで操作する場合、TPassportも対応する操作を実行します。アウター結合とは、外側の結合ステートメントを使用するかどうかを指します。
別のtpassportマッピングファイルを見てみましょう。
<hibernate-mapping package = "org.hibernate.tutorial.domain4"> <class name = "tpassport" table = "passport4"> <id name = "id column =" id "> <generator> <parpert =" property "> user </param> </generator> </id> <property"/serial "/serial"/serial " name = "expiry" type = "java.lang.integer" column = "expiry"/> <on-one name = "user" constreaded = "true"/> </class> </hibernate-mapping>
ここでは、ジェネレーターのクラス値に焦点を当てます。これは、外部のリファレンス外部キーを示し、どの参照がPARAMによって指定されます。これは、参照ユーザークラスのIDを示します。 1対1のタグには追加の制約されたプロパティがあります。これは、現在のクラスに外部キーの制約があること、つまり現在のクラスのIDがチューザーのIDに基づいて生成されることをHibernateに伝えます。
テストクラスを直接アップロードしましょう。今回は、テストクラスはJunitを使用しませんでしたが、メイン方法が直接付属していました。
public static void main(string [] args){configuration cfg = new configuration()。configure(); SessionFactory SessionFactory = CFG.BuildSessionFactory();セッションセッション= sessionfactory.opensession(); session.begintransaction(); tuser user = new Tuser(); user.setage(20); user.setname( "shuntest"); tpassport passport = new tpassport(); passport.setexpiry(20); passport.setserial( "123123123"); passport.setuser(user); user.setPassport(パスポート); session.save(user); session.getTransaction()。commive(); }コードは非常にシンプルなので、私はそれについて話しません。主にここで見てみましょう:
session.save(user);
なぜここで1つだけの保存を呼び出すのですか?その理由は、TuserマッピングファイルのCascadeプロパティがすべてに設定されているためです。つまり、Tuserで保存、更新、削除などを行うと、TPassportも対応する操作を実行するため、Session.save(Passport)を書き込む必要はありません。背景が見えます:
hibernate:inserting user4(name、age)values(?、?)hibernate:passport4(serial、expiry、id)values(?、?、?)に挿入Hibernate:2つの声明を印刷し、Hibernateが私たちのためにこの仕事をしていることを証明しています。
public static void main(string [] args){configuration cfg = new configuration()。configure(); SessionFactory SessionFactory = CFG.BuildSessionFactory();セッションセッション= sessionfactory.opensession(); tuser user =(tuser)session.load(tuser.class、new Integer(3)); System.out.println(user.getName()+":"+user.getPassport()。getSerial()); }ここでは、Tuserクラスを照会し、TPassportオブジェクトを取得します。外国キー協会
それでは、外国の鍵を通して関連を作る1対1の協会を見てみましょう。
それはまだ例と同じです:私たちは2つのエンティティクラス、tgroupとtuserを書きました
パブリッククラスのtgroupはシリアル化可能{private static final long serialversionuid = 1l; private int id;プライベート文字列名;プライベートチューザーユーザー。 // Get/set Method} public class tuser実装serializable {private static final long serialversionuid = 1l; private int id;プライベートインクエイジ;プライベート文字列名;プライベートTrupグループ; // get/set method}エンティティクラスが終了したら、マッピングファイルをご覧ください。
<hibernate-mapping package = "org.hibernate.tutorial.domain5"> <class name = "tuser" table = "user5"> <id name = "id" column = "id"> <generator/> </id> <property name = "name" type "type =" java.lang.string "column =" name "/> <propert name =" "java. column = "age"/> <muly-one name = "group" column = "group_id" unique = "true"/> </class> </hibernate-mapping>
ここでは、1対1ではなく、多面タグが使用されていることがわかります。なぜ?
以前に使用したとき、私はそれにあまり注意を払いませんでした。とにかく、私はそれを使用する必要があります。しかし、今回のXia Xinの本を読んだ後、私は最終的に、外国の鍵を介したこの結合の方法は、多くの人の特別な方法であることを理解しました。 unique = "true"を使用して、1つだけ、つまり1対1の相関が必要であることを制限します。
次に、tgroupのマッピングファイルを見てみましょう。
<hibernate-mapping package = "org.hibernate.tutorial.domain5"> <class name = "tgroup" table "table =" group5 "> <id =" id "column =" id "> <generator/> </id> <property name =" name name "type =" java.lang.string "colummen =" name "/> <one-one name" </hibernate-mapping>
ここでは、現在のエンティティとチューザーが1対1であることを示していることに注意してください。ここでは、多くのものを使用しませんが、Tuserエンティティのどの属性を指定して現在のクラスTgroupを関連付けます。ここでは、Tuserがグループ属性を介してTuserに関連付けられていることを指定します。 Property-Refは、関連するプロパティを指定します。
以下のテストクラスを見てみましょう。
public class hibernatetest {public static void main(string [] args){configuration cfg = new configuration()。configure(); SessionFactory SessionFactory = CFG.BuildSessionFactory();セッションセッション= sessionfactory.opensession(); session.begintransaction(); tgroup group = new tgroup(); group.setName( "TestGroup"); tuser user = new Tuser(); user.setage(23); user.setname( "test"); user.setgroup(group); group.setuser(user); session.save(group); session.save(user); session.getTransaction()。commive(); session.close(); }}コードは、相互に対応する対応があるため、今回は2回保存する必要があることに注意してください。 1つだけを保存しても、もう1つは操作を引き起こしません。したがって、保存された操作を2回呼び出す必要があります。最後に提出します。
Hibernateが声明を印刷します:
hibernate:Intering group5(name)values(?)hibernate:inserting into user5(name、age、group_id)values(?、?、?)
これは、2つのオブジェクト値を正しく保存したことを意味します。
クエリするために追加のテストクラスを書きます。
public static void main(string [] args){configuration cfg = new configuration()。configure(); SessionFactory SessionFactory = CFG.BuildSessionFactory();セッションセッション= sessionfactory.opensession(); tuser user =(tuser)session.load(tuser.class、new Integer(1)); system.out.println( "from user get group:"+user.getGroup()。getName()); tgroup group =(tgroup)session.load(tgroup.class、new Integer(1)); system.out.println( "from group get user:" + group.getuser()。getname()); session.close(); }どちらも正しい結果を得ることができます。これは、2つのオブジェクトを介して相手の値を取り出して目標を達成できることを示しています。
この例で使用されているTroupとTuserは単なる例です。実際、実生活のユーザーは一般に複数のグループに対応しています。