主キーの生成方法
1.主キーのカテゴリー
自然主キー
自体テーブルの主キーフィールド、特定のエンティティのプロパティは、オブジェクト自体の固有の特性です。私たちは、人のID番号、氏名、性別などの属性を持っていると言うには、ID番号は自然主キーとしてのみ可能です。
サロゲート主キー
主キーテーブル自体は必要なフィールドではありません、我々はシステムの自動成長を使用して、またはそれに加えて、メインキーで、ランダムな文字列メソッドを使用してのように。それが将来的にユーザーフィールドを修正するために私たちを助けることができるように、我々は一般的に、代理の主キーを使用して開発。例えば:私たちは生徒のデータを入力した場合は2人の学生が後方に記録数字を学びますとき、彼は非常に面倒になり、学生の情報を修正するために行くために私たちを望んでいたので、たとえば、私たちは、自然のプライマリキー(学生番号)を使用し、私たちはテーブルであるため、二つの同一の主キーは表示されませんすることができます。
2.主キーの生成方法
代理の主キーを使用するプロセスでは、自動生成された主キーは、ユーザーが手動で主キーを設定することを可能にすることはできませんやってみてください。自動的に成長するための一般的なデータベースは、プログラムが一意の識別子を生成してみましょう。
それらを休止状態では、準備工程を削減するために、内部の主キーの生成方法をご用意しております:
-
インクリメント
戦略:自動長いの増加、短い、int型
注:単一のスレッドを使用するには、次のレコードの割り当てのための1に基づいて、現在の方法は、最大のID番号テーブルを見つけることですので、複数のスレッドを使用しないでください。だから、データベースクエリの中で、同時に2つのスレッドIDフィールドは2つのスレッドIDで見つかった2つのスレッドが同じ1であるとき時に必ずしも同じエラーがレコードIDを挿入! -
アイデンティティ
戦略:自動成長
の原則:自動データベース成長機構のための成長戦略の基礎となるデータベースを使用します。MySQLの自動成長、Oracleが自動的に増加されていません。 -
シーケンス
戦略:自動成長
の原則:シーケンスの途中で、シーケンスは、Oracleサポート・シーケンスをサポートしている必要があり、MySQLは直列化をサポートしていません。 -
UUID
ポリシー:プライマリキータイプの文字列の場合は
原則:使用してランダムに生成された文字列は、主キーを休止します -
ネイティブ
ポリシー:ローカルポリシーの
原則:自動的同一性および配列を切り替えます -
割り当てられた
戦略は:休止状態では、プライマリキーの管理を支援しません
原理を手動で主キーを生成するために、電話またはプログラムで来るに:
私たちは、一般的にネイティブ使用するかの開発では、両方のuuid。
持久化
1.何が永続永続クラス&
持続性とは何ですか
データベースの処理においてメモリオブジェクト永続性(格納)。するためのフレームワークです枠組み永続休止状態に自動的にデータを更新するアップデートを呼び出すことはありません、オブジェクトの状態が永続するよう永続オブジェクトを自動的に限り、データを更新します
永続クラスとは何ですか
データベースとの確立のJavaクラスのマッピング関係。Javaのクラスマッピングファイル+
書き込みルール2.永続クラス
- 永続クラス引数なしのコンストラクタ
引数なしのコンストラクタは、対象反射体を作成できない場合、オブジェクトの下にある反射によって作成されます - 内部のプライベートフィールドがするgetおよびsetメソッドを提供
し、提供されていません。Hibernateはオブジェクトの値を取得することができなくなります - オブジェクト永続クラスに主キーの対応のうち、データベーステーブルのOIDを提供する
アドレスオブジェクトによって区別するJava同じオブジェクトであり
、それが同じレコードであるかを区別するために主キーを使用して、データベース
のHibernateには、OID属性である永続クラスによって区別これは、同じオブジェクトであります - 永続クラス属性は、パッケージタイプを使用します
パッケージタイプデフォルト値のNULL
基本的なタイプのデジタルデフォルト値を - 永続クラスが変更され、最終的な使用していない
遅延との関係をロードするために、遅延がHibernateの負荷が復帰プロキシオブジェクトに最適化されることを意味します。ダイナミックプロキシ、バイトコードエンハンスメント技術、このクラスを継承プロキシの下層。最後の場合は、継承することはできません、継承することはできません、負荷が無効であるプロキシオブジェクトの遅延を作成することはできません。
永続クラスの3部門
Hibernateは永続化永続クラスのORM操作による枠組みは、より良い3つの状態にHibernateは永続クラス、永続クラスのオブジェクトを管理するために、完成されています。
州名 | 状態 | 見分けます |
---|---|---|
瞬時状態 | 単一のOIDはありません セッション管理ではありません |
ただ、新しいオブジェクトはIDを設定されていない、それはセッションによって管理されていません |
永続的な状態 | 我々は独自のOID持つ セッション管理があるが |
Idが持っている セッションのメソッドを呼び出すために、セッションのオブジェクトは、セッションが管理のみでした |
無料/ホスティング状態/オフライン状態の | 私たちは、ユニークなOIDを持つ セッション管理ではありません |
クローズ時にセッションが閉鎖されると 、オブジェクトがフリーフォームの処理します |
状態遷移図:
キャッシュ
キャッシュとは何か、それが最適化された方法を意味し、これキャッシュ(メモリ)に格納されたデータは、データをフェッチし、私たちの調査の効率を改善するためのデータソース(データベース)である必要はありません。キャッシュは、セッションのライフサイクルと一致し、セッションレベルであり、Javaセッション構成のシリーズの集まりであることを特徴と、パーティション・キャッシュとレベル2キャッシュが休止状態。A内蔵のキャッシュがアンインストールされません。二次キャッシュは、一般企業では、自分の設定はデフォルトで有効になっていることはありませんしSessionFactoryのレベルのキャッシュであり、現在のRedis
キャッシュの1特性
- 場合ならば、更新()するsaveOrUpdate()は、セッションの保存インターフェイス()を使用して、アプリケーション、該当するセッション・オブジェクト・キャッシュが存在しない、自動的にキャッシュに書き込まれ、データベースから適切な情報を問い合わせます。
- あなたはSessionインターフェースの負荷を呼び出すと、()メソッドを取得し、リストのiteratorメソッドクエリインターフェイスは、ます、それはデータベースを照会しない、返されたオブジェクトがキャッシュに存在するかどうかを判断するには、その後、オブジェクトがキャッシュを照会していない場合、および対応するデータベースクエリオブジェクトのうち、キャッシュに加えました。
- あなたがsession.closeメソッドを呼び出すと、キャッシュがクリアされます
例で見てみましょう:
@Test
public void testSession(){
Session session = HibernateUtil.openSession();
Transaction transaction = session.beginTransaction();
//第一次获取缓存中不存在需要发送sql到数据库中查询
Customer customer1 = session.get(Customer.class, 2L);
System.out.println(customer1);
//第二次获取相同的数据,缓存中已经存在不需要去数据库获取
Customer customer2 = session.get(Customer.class, 2L);
System.out.println(customer2);
System.out.println(customer1 == customer2);
transaction.commit();
session.close();
}
上記のコードの結果が実行されます。
あなたは、それがキャッシュに直接取得することができる第二の理由で、私たちは、SQL文を送って助けを休止状態、私たちは二度同じレコードに対する要求を送ることがわかります。そして、我々は同じオブジェクトのうち2を見ることができます!
2キャッシュ内部構造
その中でも、キャッシュ領域:スナップショット地区
私たちはデータベースを照会するためにIDを使用すると、結果がクエリキャッシュがセッションに残っていた休止状態になり、それがされますスナップショットを配置するために、セッションにデータをコピーします。
セッションはまた時にセッションレベルキャッシュをきれいに、キャッシュ(フラッシュ)をクリーンアップしますときに我々はtr.commit()を使用すると、Hibernateは比較のために、オブジェクトのキャッシュオブジェクトとスナップショットのOIDを使用します。プロパティの変更、更新文の二つのオブジェクト(オブジェクトとキャッシュオブジェクトのスナップショット)は、データベース更新した場合、データ領域のスナップショットは、データキャッシュに更新され、この時間は、二つのオブジェクトの場合プロパティが変更されない場合、更新ステートメントを実行しないでください。目標は、その一貫性のあるデータ・キャッシュとデータベースを確保することです。
また、これは私たちの上記説明しますデータは自動的に更新されますなぜオブジェクトの永続状態を!