【发布时间】:2012-05-02 04:18:12
【问题描述】:
我正在通过 JBoss7.1 使用 JSF2、JPA2、EJB3 开发一个 Web 应用程序。 我有一个实体(论坛),其中包含子实体(主题)的列表。 当我第一次尝试通过 forumId 获取主题列表时,数据正在从数据库中加载。
List<Topic> topics = entityManager.find(Forum.class, 1).getTopics();
之后,我向论坛添加了更多子实体(主题),然后我再次尝试按 forumId 检索主题列表。坚果我只得到旧的缓存结果。新插入的子记录未从 DB 加载。
我可以使用以下方法加载子实体(主题):
方法一:在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:我使用的是 Extended Persistence Context 类型。
@PersistenceContext(unitName="forum", type=PersistenceContextType.EXTENDED)
protected EntityManager em;
【问题讨论】:
-
你有没有二级缓存?向我们展示论坛和主题实体的代码,以及用于向论坛添加新主题的代码。
标签: java hibernate jboss jpa-2.0