2

JBoss7.1 経由で JSF2、JPA2、EJB3 を使用して Web アプリケーションを開発しています。子エンティティ (トピック) のリストを含むエンティティ (フォーラム) があります。初めてフォーラムIDでトピックのリストを取得しようとしたとき、データはDBからロードされています。

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

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

次のメソッドを使用して、子エンティティ (トピック) を読み込むことができます。

Method1: entityManager.find() の前に entityManager.clear() を呼び出す

Method2:使用

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() メソッドを作成して、キャッシュの代わりに DB からデータをロードする方法を知りたいですか?

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

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

3 に答える 3

2

findエンティティ マネージャーと 2 次キャッシュのやり取りを制御する追加のプロパティを設定することで、個々の操作の動作を指定できます。

Map<String, Object> props = new HashMap<String, Object>();
props.put("javax.persistence.cache.retrieveMode", CacheRetrieveMode.BYPASS);
entityMgr.find(Forum.class, 1, props).getTopics();
于 2012-05-02T04:28:47.917 に答える
0

Forum.class 内に @Cacheable(false) を配置します。

于 2014-07-18T19:28:09.213 に答える