11.3. オブジェクトのロード
永続化されたインスタンスの識別子があらかじめ分かっているなら、
Session の load() メソッドを使って取得する手段があります。load() は、Class オブジェクトをとり、永続状態にあるそのクラスのインスタンスを新たに生成し、状態をロードします。
Cat fritz = (Cat) sess.load(Cat.class, generatedId);
Cat fritz = (Cat) sess.load(Cat.class, generatedId);
// you need to wrap primitive identifiers long id = 1234; DomesticCat pk = (DomesticCat) sess.load( DomesticCat.class, new Long(id) );
// you need to wrap primitive identifiers
long id = 1234;
DomesticCat pk = (DomesticCat) sess.load( DomesticCat.class, new Long(id) );
あるいは、以下のように、既存のインスタンスに状態をロードすることもできます:
Cat cat = new DomesticCat(); // load pk's state into cat sess.load( cat, new Long(pkId) ); Set kittens = cat.getKittens();
Cat cat = new DomesticCat();
// load pk's state into cat
sess.load( cat, new Long(pkId) );
Set kittens = cat.getKittens();
DB に該当する行が無い場合、
load() は回復不可能な例外を投げることに注意しましょう。そのクラスがプロキシを使ってマッピングされている場合、 load() は初期化されていないプロキシを返し、プロキシのメソッドが呼ばれるまで実際にはデータベースにアクセスしません。実際にデータベースからロードせずに、オブジェクトに対する関連を作りたい場合、この振る舞いはとても役立ちます。batch-size がクラスマッピングに定義されている場合、複数のインスタンスを一括でロードすることが可能です。
該当する行が存在することを確信できない場合は、データベースにすぐにアクセスし該当する行が無いと null を返す
get() メソッドを使うべきです。
Cat cat = (Cat) sess.get(Cat.class, id);
if (cat==null) {
cat = new Cat();
}
return cat;
Cat cat = (Cat) sess.get(Cat.class, id);
if (cat==null) {
cat = new Cat();
}
return cat;
LockMode を使えば、SELECT ... FOR UPDATE という SQL を使ってオブジェクトをロードすることができます。詳細な情報は、API ドキュメントを参照してください。
Cat cat = (Cat) sess.get(Cat.class, id, LockMode.UPGRADE);
Cat cat = (Cat) sess.get(Cat.class, id, LockMode.UPGRADE);
関連に対するカスケードスタイルとして
lock や all を指定しない限り、関連するインスタンスや包含するコレクションは FOR UPDATE で選択されません。
refresh() メソッドを使うことで、どんなときでも、オブジェクトやそのコレクションをリロードすることができます。データベースのトリガがテーブルを更新した際に、そのテーブルに対応するオブジェクトのプロパティを同期する場合、このメソッドが役に立ちます。
sess.save(cat); sess.flush(); //force the SQL INSERT sess.refresh(cat); //re-read the state (after the trigger executes)
sess.save(cat);
sess.flush(); //force the SQL INSERT
sess.refresh(cat); //re-read the state (after the trigger executes)
Hibernate がデータベースから、どのくらいの量をロードするのでしょうか?またどのくらいの数の SQL の
SELECT 文が使われるのでしょうか?これは、フェッチの戦略 によります。これについては、「フェッチ戦略」で説明しています。