我正在通过JBoss7.1使用JSF2,JPA2,EJB3开发Web应用程序。
我有一个实体(论坛),其中包含子实体(主题)列表。
当我第一次尝试通过forumId获取主题列表时,正在从数据库中加载数据。
List<Topic> topics = entityManager.find(Forum.class, 1).getTopics();
之后,我要向论坛中再添加几个子实体(主题),然后再次尝试按forumId检索主题列表。坚果我只得到旧的缓存结果。不会从数据库加载新插入的子记录。
我可以使用以下方法加载子实体(主题):
方法1:在entityManager.find()之前调用entityManager.clear()
方法2:使用
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()方法位于超级CrudService中,该服务已由所有DAO(无状态EJB)扩展。因此,设置QueryHints对我不起作用。
所以我想知道如何使em.find()方法从数据库而不是从缓存加载数据?
PS:我正在使用扩展持久性上下文类型。
@PersistenceContext(unitName="forum", type=PersistenceContextType.EXTENDED)
protected EntityManager em;
最佳答案
您可以通过设置控制实体管理器与二级缓存交互的其他属性来指定单个find
操作的行为。
Map<String, Object> props = new HashMap<String, Object>();
props.put("javax.persistence.cache.retrieveMode", CacheRetrieveMode.BYPASS);
entityMgr.find(Forum.class, 1, props).getTopics();