2012-05-02 26 views
2

JSF2、JPA2、EJB3をJBoss7.1経由で使ってWebアプリケーションを開発しています。 私は子エンティティ(トピック)のリストを含むエンティティ(フォーラム)を持っています。 forumIdでトピックのリストを初めて取得しようとしましたが、データはDBからロードされています。JPA2(JBoss7.1のHibernate)entityManager.find()がDBからではなく、キャッシュからデータを取得しています

List<Topic> topics = entityManager.find(Forum.class, 1).getTopics(); 

その後、私はフォーラムに少数のエンティティ(トピック)を追加してからフォーラムアイデアでトピックのリストを取得しようとしています。ナット私は古いキャッシュされた結果のみを取得しています。新しく挿入された子レコードはDBからロードされていません。

私は、次の方法を使用して子実体(トピック)をロードすることができています:

方法1:

を使用して:はentityManager.find()

方法2前entityManager.clear()を呼び出します

em.createQuery("select t from Topic t where t.forum.forumId=?1", Topic.class); 

または

em.createQuery("SELECT t FROM Topic t JOIN t.forum f WHERE f.forumId = ?1", Topic.class); 

NamedQueriesでQueryHintsを設定しています。しかし、em.find()メソッドはすべてのDAO(ステートレスEJB)によって拡張されているスーパーCrudServiceにあります。だから、QueryHintsの設定は私にとってはうまくいかないでしょう。

私はem.find()メソッドをCacheの代わりにDBからロードする方法を知りたいのですが?

PS:私はExtended Persistence Contextタイプを使用しています。

@PersistenceContext(unitName="forum", type=PersistenceContextType.EXTENDED) 
protected EntityManager em; 
+0

2次キャッシュを持っていますか?フォーラムとトピックのエンティティのコードと、新しいトピックをフォーラムに追加するためのコードを表示します。 –

答えて

1

あなたは二次キャッシュを持つエンティティマネージャの相互作用を制御する追加のプロパティを設定することで、個々のfind操作の動作を指定することができます。

Map<String, Object> props = new HashMap<String, Object>(); 
props.put("javax.persistence.cache.retrieveMode", CacheRetrieveMode.BYPASS); 
entityMgr.find(Forum.class, 1, props).getTopics(); 
+0

私はBYPASSについて知りませんでした。+1 – mprabhat

+0

props.put( "javax.persistence.cache.retrieveMode"、 "BYPASS");動かない。同じ古いキャッシュオブジェクトを取得しています。 –

+0

プロバイダによっては、JPA 2.0 enumを使用する必要があります。私の答えに編集を参照してください。 – Perception

0

はそれがForumTopicとの関係は、あなたのエンティティBeanに一方向に追加されたことは可能ですか?トピックにフォーラムIDを設定した場合は、このトピックをForumオブジェクトに追加して、第1レベルのキャッシュ内で一貫したデータを保持する必要があります。また、更新と検索のために2つの異なるエンティティマネージャを使用していないことを確認する必要があります。第1レベルのキャッシュはエンティティマネージャごとにのみ保持され、別のレベルのキャッシュには引き続きエンティティの古いバージョンが含まれます。

em.getEntityManagerFactory().getCache().evict(Forum.class, forumId); 
0

入れ@Cacheable(偽)フォーラム内:

おそらく無関係な、しかしJPA2で、あなたはまた、更新後に使用できる二次キャッシュからエンティティを立ち退かせるための最小限のAPIを持っています。クラス。

関連する問題