Close

Accessing Second-Level Cache via Cache interface

[Updated: Mar 10, 2018, Created: Mar 10, 2018]

An object representation for the second-level cache can be obtained via following method of EntityManagerFactory:

Cache getCache();

The returned value is an instance of Cache interface which has following methods:

package javax.persistence;
  ...........
public interface Cache {
    public boolean contains(Class cls, Object primaryKey);//returns true if the specified entity is in the cache
    public void evict(Class cls, Object primaryKey);//removes the specified entity from the cache
    public void evict(Class cls);//removes all entities of the specified type from the cache
    public void evictAll();//clear the cache
    public <T> T unwrap(Class<T> cls);
}

The method unwrap() can be used to obtain the provider specified API to access/manipulate the cache, e.g. the instance of org.hibernate.cache.spi.RegionFactory can be obtained in case of Hibernate.

Example

The Entity

@Entity
public class Employee{
  @Id
  @GeneratedValue
  private long id;
  private String name;
  private String dept;
    .............
}

The main class

public class ExampleMain {
  private static EntityManagerFactory entityManagerFactory =
          Persistence.createEntityManagerFactory("example-unit");

  public static void main(String[] args) {
      try {
          persistEntity();
          loadEntity();
          evictFromCache();
          printCacheState();
      } finally {
          entityManagerFactory.close();
      }
  }

  public static void persistEntity() {
      Employee employee = new Employee();
      employee.setName("Dawn");
      employee.setDept("IT");
      EntityManager em = entityManagerFactory.createEntityManager();
      em.getTransaction().begin();
      em.persist(employee);
      em.getTransaction().commit();
      System.out.println("Employee inserted: " + employee);
      em.close();
      printCacheState();
  }

  private static void loadEntity() {
      EntityManager em = entityManagerFactory.createEntityManager();
      Employee employee = em.find(Employee.class, 1L);
      System.out.println("Employee loaded: " + employee);
      em.close();
      printCacheState();
  }

  private static void printCacheState() {
      Cache cache = entityManagerFactory.getCache();
      boolean contains = cache.contains(Employee.class, 1L);
      System.out.printf("Cache#contains(): %s%n", contains);
  }

  private static void evictFromCache() {
      Cache cache = entityManagerFactory.getCache();
      cache.evict(Employee.class, 1L);
      System.out.println("entity evicted");
  }
}
Employee inserted: Employee{id=1, name='Dawn', dept='IT'}
Cache#contains(): true
Employee loaded: Employee{id=1, name='Dawn', dept='IT'}
Cache#contains(): true
entity evicted
Cache#contains(): false

Example Project

Dependencies and Technologies Used:

  • h2 1.4.196: H2 Database Engine.
  • hibernate-core 5.2.12.Final: The core O/RM functionality as provided by Hibernate.
    Implements javax.persistence:javax.persistence-api version 2.1
  • hibernate-ehcache 5.2.12.Final: Integration for Ehcache into Hibernate as a second-level caching service.
  • JDK 1.8
  • Maven 3.3.9

Accessing Second-level Cache Example Select All Download
  • jpa-using-cache-interface
    • src
      • main
        • java
          • com
            • logicbig
              • example
                • ExampleMain.java
          • resources
            • META-INF

    See Also