Hibernateでのgetとloadの違い



Difference Between Get



Hibernateのgetとloadは、主にデータベースからオブジェクトを取得するために使用されます。
プロセスは非常に簡単です3つのステップがあります
1セッションセッションオブジェクトを取得します
2トランザクションを開きます
3実行方法
4コミットトランザクション

負荷()



1 get the Session session object Session session=HibernateUtil.getCurrentSession() 2 open the transaction session.beginTranscation() 3Retrieve the primary key with a value of 1 in the User class. User user=session.load(User.calss,1) / / Take out the user name id and UserName in the data table System.out.println('userId='+user.getUserId()) System.out.println('userId='+user.getUserName()) 4 commit the transaction session.getTranscation().commit()

プロセス分析:
1session.loadはユーザーオブジェクトを取得し、プロキシはエンティティクラスオブジェクトの主キーのみを保存します
4この時点での主キーはすでにプロキシオブジェクトにあるため、Selectクエリは発行されません。
5現時点では、プロキシオブジェクトクラスに値がないため、selectクエリを送信します。

結論:loadメソッドを使用してオブジェクトを取得する場合、hibernateは遅延読み込みメカニズムを使用してプロキシオブジェクトとして機能します。プロキシオブジェクトは、エンティティクラスオブジェクトのID(主キーフィールド)のみを保持します。このオブジェクトを使用して他のプロパティ値を取得する場合、select sqlステートメントがデータベースに送信され、必要なオブジェクトをクエリします。



取得する:

public void get02(){ 1Session session = HibernateUtil.getCurrentSession() 2session.beginTransaction() 3User user = session.get(User.class, 1) / / send select statement, query the primary key of 1 4System.out.println('userId='+user.getUserId()) 5session.getTransaction().commit()

プロセス分析:
このメソッドでは、getメソッドは、ステップ4を実行する前に、クエリをデータベースに送信してクエリを実行します。
getとloadの主な違いは次のとおりです。
Selectsqlのタイミングが発生します :シングルトンデザインモードの空腹で怠惰なモードのようなものです。

{getは空腹モードよりも優れています。クラスがロードされるとすぐに、データベースからデータを取得するためにselectsqlステートメントが送信されます。
負荷はレイジーモードのようなものです。他の属性値が必要な場合、selectsqlステートメントがデータベースから送信されます。 }



返された結果
getメソッドは、常にクエリのエンティティクラスオブジェクトを返します
loadメソッドはプロキシオブジェクトを返します。

最後のポイントが追加されます:
Id //クエリ条件、つまり主キーの値
getメソッドとloadメソッドはどちらも、IDに基づいて対応するデータを取得しますが、取得メカニズムは異なります。

簡略化:----->レベル1キャッシュ----->レベル2キャッシュ-----いいえ---->データベースにクエリがあるかどうかを確認します----いいえ----> null

簡略化:存在を確認します----->レベル1キャッシュ----なし->遅延---- true->遅延読み込み戦略を使用します。オブジェクトにアクセスするときは、L2キャッシュに移動してクエリを実行します-----なし---->データベース----なし->例外をスローします

詳細な説明:
getメソッドを使用する場合、hibernateはIDに対応するデータが存在するかどうかを確認し、存在しない場合は最初にセッションに移動してクエリを実行します(セッションキャッシュは実際には休止状態のレベル1キャッシュです)。存在しない場合は、セカンダリキャッシュに移動してクエリを実行します。 、そうでない場合は、データベースクエリに移動しますが、まだ見つかりません。その後、nullを返します。

Loadには、getに比べて遅延読み込み戦略があります。 lazy = falseの場合、loadはgetと同じです。
loadメソッドを使用する場合、hibernateはIDに対応するデータが存在する必要があると判断し、セッションキャッシュに移動して、見つからない場合は、遅延属性値に従って遅延読み込みを使用するかどうかを判断します。 lazy = 'true'の場合、遅延読み込みを使用し、プロキシオブジェクトを返し、オブジェクトのプロパティへの実際のアクセスがセカンダリキャッシュクエリに移動するまで待ちます。そうでない場合は、データベースクエリに移動し、そうでない場合は、組織をスローします。 hibernate.ObjectNotFoundExceptionがスローされます。 lazy = ‘false’の場合、遅延読み込みは使用されません。