K. Siva Prasad Reddy
K. Siva Prasad Reddy

Reputation: 12385

JPA2(JBoss7.1's Hibernate) entityManager.find() is getting data from Cache not from DB

I am developing a web application using JSF2, JPA2, EJB3 via JBoss7.1. I have an Entity(Forum) which contains a list of child entities(Topic). When I tried to get the list of Topics by forumId for the first time the data is being loaded from DB.

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

After that I am adding few more child entities(Topics) to Forum and then again I am trying to retrieve list of Topics by forumId. Nut I am getting the old cached results only. The newly inserted child records are not being loaded from DB.

I am able to load the child entities(Topics) by using following methods:

Method1: Calling entityManager.clear() before entityManager.find()

Method2: Using

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

or

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

I am aware of setting the QueryHints on NamedQueries. But em.find() method is in a super CrudService which is being extended by all DAOs(Stateless EJBs). So setting QueryHints won't work for me.

So I want to know how can i make em.find() method to load data from DB instead of Cache?

PS: I am using Extended Persistence Context type.

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

Upvotes: 2

Views: 4712

Answers (3)

Victor Jatob&#225;
Victor Jatob&#225;

Reputation: 837

Put @Cacheable(false) within the Forum.class.

Upvotes: 0

J&#246;rn Horstmann
J&#246;rn Horstmann

Reputation: 34014

Is it possible that the relation between Forum and Topic was only added in one direction in your entity beans? If you set the forum id on the topic, you should also add this topic to the Forum object to have consistent data inside the first level cache. You should also make sure that you are not using two different entity managers for the update and find. The first level cache is only kept per entity manager, another em can still contain an older version of the entitiy.

Probably unrelated, but with JPA2 you also have a minimal api to evict entities from the second level cache, which could be used after an update:

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

Upvotes: 0

Perception
Perception

Reputation: 80603

You can specify the behavior of individual find operations by setting additional properties that control the entity managers interaction with the second level cache.

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

Upvotes: 2

Related Questions