我正在通过 JBoss7.1 使用 JSF2、JPA2、EJB3 开发一个 Web 应用程序。我有一个实体(论坛),其中包含子实体(主题)的列表。当我第一次尝试通过 forumId 获取主题列表时,数据是从数据库加载的。
List<Topic> topics = entityManager.find(Forum.class, 1).getTopics();
之后,我向论坛添加了更多子实体(主题),然后我再次尝试按 forumId 检索主题列表。坚果我只得到旧的缓存结果。新插入的子记录未从数据库加载。
我可以使用以下方法加载子实体(主题):
方法一:在 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;