2011-09-19 4 views
6

セッションに、指定されたクラス/識別子のエンティティが含まれているかどうかを確認できます。私は現時点でこれを行う方法を見ることができません。Hibernate session.contains(クラスclazz、Serializable id)

  • は、プロキシがいつも作成されるとnullを返すことはありません、私は
  • load()を行うにはしたくないどのエンティティが存在しない場合ではないクラス+キー
  • get()は、データベースを照会エンティティオブジェクトを取りますこのメソッドを使用することはできません

DBへの副作用/クエリなしで上記を行うことは可能ですか?

+0

興味があるだけ - なぜあなたは、与えられた識別子を持つオブジェクトがセッションにあるかどうかを知る必要がありますか? 'get(id)'を実行して、オブジェクトがすでにSessionに入っている場合、Hibernateはそのインスタンスを返し、それを再クエリしないという事実に頼ることはできませんか? –

+0

このインスタンスでは、いくつかのカスタムキャッシュとの対話を休止させようとしていますが、非常に特定のインスタンスでのみ動作します。ほとんどの場合、データベースにアクセスするデフォルトの動作に満足していますので、 、キャッシュからロードしない場合。キーは、多対1の参照を持つ他のオブジェクトからの参照が存在する可能性があるため、セッション内の何かを妨害することはできません。 –

+0

@MikeQあなたはIdentityMapの仕組みについて絶対に正しかったので、私の答えは削除されました。 – Marcelo

答えて

1

私自身の質問に答える。

パブリックAPIでこれが可能であるとは思われません。あなたには、いくつかのチーズを容認して喜んでいる場合は、あなたが以下の

 SessionImplementor sessionImplementor = ((SessionImplementor)session); 
     EntityPersister entityPersister = sessionImplementor.getFactory().getEntityPersister(clazz.getName()); 
     PersistenceContext persistenceContext = sessionImplementor.getPersistenceContext(); 

     EntityKey entityKey = new EntityKey(id, entityPersister, EntityMode.POJO); 

     Object entity = persistenceContext.getEntity(entityKey); 

     if (entity != null) 
      return entity; 

     entity = persistenceContext.getProxy(entityKey); 

     if (entity != null) 
      return entity; 

     return null; 

を行うことができますこれは、内部的に変更された場合ので、将来的に動作しないことがあります休止状態の内部APIに依存しています。

1

わかりません。セッションは、特定の型とIDのエンティティを取得しようとしたときにDBをチェックし、IDを含んでいない場合は常にチェックします。

実際、これはモデルの良い点の1つです。 JPA/Hibernateがオブジェクト、キャッシュ(第1レベルまたは第2レベル)、またはDBを取得する場所を気にする必要はありません。

メモリにエンティティがある場合、そのエンティティがセッションから切り離されているかどうかを確認できますが、セッション内に存在していないかどうかを確認できます。

0

getIdentifier(..)を使用してください。現在のセッションに関連付けられている、指定されたエンティティの識別子値を返します。Javadocを参照してください。

+0

それは私が求めているものではありません。 –

3

これは動作します:

public boolean isIdLoaded(Serializable id) 
{ 
    for (Object key : getSession().getStatistics().getEntityKeys()) 
    { 
     if (((EntityKey) key).getIdentifier().equals(id)) 
     { 
      return true; 
     } 
    } 

    return false; 
} 
関連する問題