get() メソッド

オブジェクトをその ID (または主キー) で取得したい場合、Hibernate にはそのための 3 つのメソッドがあります。

  • ロード()
  • 得る()
  • 探す()

やることは同じですが、微妙な違いがあります。get()メソッドの一般的な形式は次のとおりです。

EntityClass Name = session.get(EntityClass.class, Object primaryKey);

get()メソッドは、返す必要があるオブジェクトの ID (主キー) を 2 番目のパラメータとして受け取ります。次に、そのオブジェクトをデータベースからロードして返します。例:

User user = session.get(User.class, 2);

この ID を持つレコードがデータベース内に見つからない場合、メソッドは null を返します。

load() メソッド

オブジェクトをロードする 2 番目のメソッドは、load()メソッドです。load()メソッドの一般的な形式は同じです。

EntityClass Name = session.load(EntityClass.class, Object primaryKey);

ただし、その動作はget()メソッドとは異なります。

まず、このメソッドは実際のオブジェクトではなく、プロキシ、つまり仮想スタブを返します。

次に、load()メソッドを使用する場合、データベースにそのようなエントリが存在するかどうかはチェックされません。代わりに、Hibernate は渡された ID を使用してプロキシ オブジェクトをすぐに作成し、それを返します。

第三に、データベースでのすべての作業は、プロキシ オブジェクトのメソッドを呼び出すときに行われます。たとえば、getName()メソッドを呼び出そうとすると、データベースへの最初の呼び出しが行われます。例:

User user = session.load(User.class, new Integer(123));
String name = user.getName(); //this is where the first call to the database will occur

データベース内のオブジェクトの存在を確認するために、load()メソッドを使用しないでください。単純に、これが表示されないだけです。さらに、null などの無効な ID を渡すと、単純に null が返されます。

find() メソッド

find()メソッドは、JPA 標準からSessionインターフェースに渡されました。ご存知のとおり、この標準はメソッドのシグネチャを説明するだけでなく、動作も規制します。

このメソッドはget()メソッドとまったく同じように機能します。渡されたキーでオブジェクトが見つからなかった場合、メソッドは単に null を返します。

User user = session.find(User.class, -2); //method will return null

リフレッシュ()メソッド

データベースからのオブジェクトのロードに関連するもう 1 つの便利なメソッドは、refresh()メソッドです。

渡されたオブジェクトに基づいてデータベース内のデータを更新するpersist()メソッドを覚えていますか? したがって、refresh()メソッドはまったく逆の動作をします。つまり、データベースのデータに基づいて既存のオブジェクトを更新します。

この動作は、たとえばオブジェクトをデータベースに書き込むときに、書き込まれたデータを修正するさまざまなストアド プロシージャがそこで呼び出される場合に必要です。

このような場合、オブジェクトが変更されている可能性がある場合は、データベースからオブジェクトを再度読み取ると便利です。例:

User user = new User();
user.setName("Kolyan");
session.persist(user);
session.flush();  //Force called SQL INSERT and call triggers

session.refresh(user);
// here we continue to work with the updated object