序文
不可解長い少数痘、TMは本当に傷つけ、そして今、あまりにも少し動き、コンピュータで毎日であってもよいし、実行のために行くために2つの時間を過ごすために、この日の午後を決め、
多くを理解するために、今日、多くのマッピング関係について何かを言うために、説明する前の章の間で今、多くのマッピングに続いて、多くの個人的な感情の多くは非常に簡単です、あなたは明らかにそのデータベースとの間の関係を推論する必要があります図は、その後、あなたはそれを獲得しました。設定マッピングファイルや、常にそのような死んだもの。
--WZY
答えるために小さな質問
一つの問題:ここでは、多くの学習者があり、彼が休止状態の使用は、独自のテーブルを作成する必要はありません知りませんでしたので、混乱し自動または休止状態、あなたがあなた自身のテーブルを作成する必要がある場合は、メインの外部キーは、この設定は、独自の権利を設定されます?(あなたは以下を参照の説明の間に、多くのマッピングをスキップすることができます知っていれば)人々は非常に混乱して感じることを、今、この小さな疑問を解決するために
回答:実際の開発の観点からは、言った:確かにテーブルを作成し、テーブルには、彼らがエンティティクラスを生成するために、逆に、その後、初期データをインポートし、それらが生成されるかを確認するために必要なものとの間のマッピングの様々な。
我々はまた、それがデータベースとテーブルの分野における様々なテーブル間の良好な関係を作成することはできません、良いデータベーステーブルおよびいくつかの初期データを作成するために、テストと学習段階で行うことができ、あなただけでは、手動でデータベースを構築し、そのデータベースを必要とします問題のないテーブルが存在しない、キーは、このデータベースを持っていることです。何のテーブルが存在しない場合、我々は、何のケースがない場合はテーブルの下に、テーブルを作成するのと同等で、クエリに直接移動するよう新しいエンティティクラスとして、コードテーブルで作成する必要があり、報告書は確かに存在しません。エラー、各テーブルのフィールドとテーブル間の外部キー関係が、休止状態を通じて学位を完了するために、私たちを助けることができ、我々はマッピングファイルとエンティティクラスを作成し、それがのテーブルとテーブル間のコンテンツの関係を作成することです。これは、構成プロパティに依存します。
値</小道具> <キー= "hibernate.hbm2ddl.auto" を支えます>
値値は、4つにすることができます
作成:最初のドロップ、再作成開始を表します。あなたが起動するたびにことを、最初のデータベーステーブルを削除し、次に1を作成します。開発者は、より多くの使用をテストします
また、作成を表し、それが落ちる前に、システムが実行されますドロップを作成します。各テーブルには、削除する前に、このようなの作成に使用されるときのように、閉じられます
更新:更新スキームを行うスキーマかどうかを確認する場合は、この操作が開始され、そうでない場合。チェックそれは休止状態にあり、データベーステーブルのフィールドの関係は一貫して、一貫性のないデータベースが更新されます
例外をスローしない場合は、起動休止状態の設定と一致している既存のスキーマを確認し、更新されません:検証を。
概要:限り表は、当社のデータベースに存在するように、我々は彼の操作を行うことができるようになります(表内のフィールドの変換、外部キーと他の共同学位によって他のテーブルが独立して完了することができます)私たちは、基本となるデータベースの手動操作に行かを必要とせずに、。だから、この本が動作コードを休止状態に最も直接的で、どのような種類のデータベースを心配することなく、彼らは、彼らが十分で動作するデータベーステーブルを持っていることを条件とします。
第二の問題:基礎となるデータベースの主キーを作成する必要が自動的に生成され、中にxxx.hbm.xmlの主キー生成方法、把握するには、この必要性を混同することはできません。あなたはAUTO_INCREMENTを使用すべきではない最後に、主キーのデータベースのプライマリキー生成戦略にもつれた場合、その後、次の2つの間の関係を総括する必要があります。(私は偉大な男だTMDは、あなたがまとめる助けるために)
<id名= "ID"列= "ID">
<! -主键生成策略- >
<ジェネレータクラス= "増加"> </ジェネレータ>
</ ID>
一般的に6種類で使用されるプライマリキー生成戦略
1は、インクリメント:管理、メインは自動的に拡張取得する自動キー、そしてあなたはAUTO_INCREMENTアップを設定することはできませんデータベースの主キーを休止します。
2、アイデンティティ:基礎となるデータベースの管理は、そのデータベースは、その後、手動で設定する必要があり、独自の主キーが自動的に(AUTO_INCREMENT)は、設定されていない成長するように設定されている必要があります非常に良いではありません。
MySQLとそのためのSQL Serverのサポートが、Oracleはそれが自動的に拡張基礎となるOrableによってサポートされていない、サポートしていませんが、Oracleはその順序別の根本的なメカニズムを持っています
3、シーケンス:基礎となるデータベース管理、データベース自体の主キーを提供するためには、我々がカウントする方法を具体的に知りませんどのくらいです
、右ここで、低レベルの使用のAUTO_INCREMENT、成長のこの一連の低レベルの使用をこれら二つの違いをOracleがMySQLがこれをサポートしていません、これを使用しますが、MySQLのサポートIDは、つまり、データベースが自動的に拡張してみましょう。
4、ネイティブ:Hibernateは管理していないので、どのように基礎となるデータベースのプライマリキー生成を選択するために、それはそれはmysqlのであれば、それはそれは、デフォルトのシーケンスOracleのであれば、我々はそのように、自分のAUTO_INCREMENTを設定する必要があり、つまり、アイデンティティをデフォルトのだろう、と言うことですあなた自身を設計し、基礎となるデータベース内のどの成長のシーケンス
5、UUIDは:誰もがそれは、我々はデータベースの主キーを設定する必要はありませんものです、に精通していることを、主キーのそれぞれは、32のランダムな文字列を生成します
図6は、割り当てられた:これは非常に簡単です、我々は手動でプライマリー自分の価値観への鍵、休止状態と私たちはセットアップを支援するためのイニシアチブを取っていないのデータベースを設定する必要があるということです。
6で、同一性および配列がデータベースに自分自身を設定する必要があり、自動的に増加または成長の順序、実際には非常に良い学校です、増分は、私たちは、主キーを休止状態管理を支援することです。基礎となるデータベースは、データベースがOracleなど、自動成長をサポートするために必要であることを提供し、何を書く必要はありません、これを取るネイティブでも、データベースに自分自身を設定する必要があるが、同一性および配列よりも柔軟性が、基礎となるデータベースを変更しないだろう、あなたはこれを必要としません変更は、UUIDはまた、これを簡単に割り当てられたすべての人、非常に精通している、主キーの値が自分のことを書くために使用されています。
この目的のために、私たちの関係の公式の開始対多マッピング
多くのマッピング関係に第二に、多くの
多くの関係1が、それははるかに簡単、および多対多のサブウェイと2ウェイ多く、多くの-が、比較的簡単な方法実際にあり、かつ使用した後、既にほとんどの双方向は明らかです対多、多対ノウハウ双方向、一方向-多くは非常に簡単ですので、我々は、直接、多くの双方向について話しています
、生活の中で多くの例には、多くの最も簡単で、私たちの生活に近い多くの双方向性であり、
学生と選択科目1との間の関係は、学生は、コースが複数の生徒を選択することができ、多くのコースを選択することができます
2、淘宝網のショッピングでは、複数の人物を選択することができます商品は、人は複数の項目を選択することができます
3、....これらの多くの関係、および学生の入学の多くを説明するために、この例を見てみましょう。
多くの関係を保存するには、二つのテーブルでは十分ではありません、我々は次のデータベースダイアグラムを見て、この関係を表すために第三のテーブルを追加する必要があります。
この図は、テーブルのstudent_course真ん中で二つのテーブルの学生とコースの間の関係を保存することを意味し、student_courseは主キーです。しかし、また、学生の外部キー、ポイントCIDのSIDとコース。
一部の人々は確かに、なぜ第三のテーブルを使用して、ちょうど2つの外部キーを使用していない、あなたが私を指して、私はあなたがこれを行うポイントだと思い学んデータベースは知っている必要がある場合、これは、大きな問題を公開します、そのような二つのテーブルが相互に関係している場合、これら2つのテーブル間の関係がそこに固定され、削除テーブルを削除することができない、あなたはデータテーブルを照会し、この小都市は、無限ループが発生します、あなたは確認してください私は、私はそれを繰り返して、あなたがにチェックイン。そして、GG。
解決
なぜ私たちは、主キーと2つの外部キーを設定する必要があります:
接続テーブルのためにこれらのレコードを取得するための接続テーブルで自分の主キーのクエリを通じて学生、すべてのコースの学生の記録にそれらのレコードだけでなくそこに多くがあり、そのレコードに問い合わせて、それは、複合主キーであるため、当然の外部キーは、見つかりました。C_IDにより対応するテーブルのコースレコードを記録することが可能です。逆に、接続テーブルに多数のレコードを取得するために、主キーのクエリによるコースは、接続テーブルには、学生を記録することにより、S_IDは、該当するレコードで見つけることができ、また、外部キーの学生です。そのため、デザインは、このようなテーブルであるこれらの主キー、外部キーとも都市は、便利ですが必要です。私は他のいくつかを見つけることができません。
図2に示すように、構成及びマッピング・エンティティクラス
学生の永続クラスとStudent.hbm.xml
//学生エンティティクラス のパブリッククラスの学生{ プライベートSID整数; プライベート文字列SNAME; //が格納されたプログラムの複数の選択されたセットで設定された プライベート・セット<コース、> = courseSet新しい新しいHashSetの<コース>(); セットは、GET ... ... } //Student.hbm.xml <クラス名= "domain.Student"表= "学生"> <名前ID = "SID"列= "SID"> <! -主キーの生成戦略- > <ジェネレーター=クラス"INCREMENT"> </ジェネレータ> </上記のid> <! -いくつかの一般的なプロパティ- > <プロパティ名= "SNAME"> </ property>の
<! -ここで極めて重要な場所。これは彼の頭の中で何を意味するのデータベースダイアグラムを持つことである2つの列を把握するために参照してください- >
<! <! -外部キー名の接続テーブルでこのエンティティクラス、非常に明確に上記の我々の分析もちろん、なぜこの1?> -現在のテーブルの接続点は、S_IDのエンティティクラスという名前の外部キーを持っていることを知らせて休止状態 <キー列=「S_ID」> </ key>の マッピングクラスやクラス、多くのマッピング関係への多くは、マッピングされました- <! > -上記の文と同じ意味を接続テーブルの外部キー名は、Hibernateクエリを実行する方法を知って、この方法を休止させ知ることです 」= <-to-多くの多くのクラス=「domain.Course」欄をC_ID「> </多対多の> </ SET> </クラス>
コース和Course.hbm.xml
//コースエンティティクラス パブリッククラスコース、{ プライベートint型のCID; プライベート文字列CNAME; ;プライベート設定<学生> = studentSet新しい新しいHashSetの<学生>() ... } 上記の分析では//Course.hbm.xml、それは簡単で、コンテンツおよび上記と全く同じ意味です。 <クラス名= "domain.Course"表= "コース"> <名前= ID "CID"欄= "CID"> <! -主キーの生成戦略- > <Generatorクラス= "INCREMENT"> </ジェネレータ> </ ID> <! -いくつかの一般的なプロパティ- > <プロパティ名= "CNAME"> </ property>の <SET名= "studentSet"表= "student_course">
<! -接続のテーブル名の外部キーにマッピングされたマッピング関係、マッピングクラスやクラスの多くに多くの- > <多対多クラス=「domain.Student」欄=「S_ID」> </多対多> </ SET> </クラス>
3、テストクラス
//他は省略されて、ちょうど重要なコードを記述します。新しく設立された関係として、データベースは、その後、任意のデータを持っている初期データを追加しません。ここで問題があるでしょう。ケースを開くには、この行のコメントをした場合
org.hibernate.exception.ConstraintViolationExceptionが間違って報告し、なぜこれがそうですか?実際には、我々が知ることができる(ただし、その分析はほぼ同じでそれとデータを高めるために例のクエリとして使用されている)、データベース設計の私たちの以前の分析から
StudentSetコースで学生を追加し、このプロセスは、それが何ですか?動作させるためにStudentSetのので、それが接続テーブルで、生徒のレコードのSIDを対応するコースCIDを追加し、学生を追加し、接続テーブルを見つけるだろう、とならば、
あなたはstudent.getCourseSetを使用している()。追加します(もちろん)、その後、接続テーブルに行ってきましたが、それは主キーであるため、この時間は確かにそれに補間する方法と同じ2つのレコードが、ああ、エラーになりますまったく同じのレコードを追加します。だから、A異常な制約違反(主キー制約の違反)があるでしょう。
コース=新新コース、コース、(); course.setCname( "化学"); 学生学生学生新しい(=新しい); student.setSname( "QQQ"); 。Course.getStudentSet()を追加します(学生); // student.getCourseSet ;()(コース).add Session.save(コース)。 session.save(学生)。
図4に示すように、図の効果。
V.の概要
双方向-多くは、それが簡単で理解するために見つけることが、学ぶために初めに、その中に周りに感じるだろうしたら、各ステップは、接続テーブルにはそのように設定する必要が理由を理解することが重要であるかを知る必要があります。あなたはこの双方向多くのマッピング関係を学んだ簡単に理解し、あなたがバグの多くを隠している、自分の手について実現する必要があり、解決するために、独自のを必要とします。あなたはそれを書いていない場合は、数日、理解したり、自分自身を書くのではなく、他の人のコードをつかむに依存しています。