Java.Hibernate.Medium.How do you configure second-level cache with Ehcache or another provider?

Short Answer

To configure Hibernate’s second-level cache with Ehcache (or another provider), you:
1️⃣ Add the caching library to your dependencies.
2️⃣ Configure Hibernate properties to enable second-level and query caches.
3️⃣ Configure your cache provider (Ehcache or others) via XML or programmatically.
4️⃣ Annotate entities with caching annotations.


🔎 Detailed Explanation

🔹 1) Add Dependencies
For Ehcache 3 with Hibernate 5 or 6, add Maven dependencies (adjust versions as needed):

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-ehcache</artifactId>
    <version>5.6.15.Final</version>
</dependency>
<dependency>
    <groupId>org.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>3.10.8</version>
</dependency>

🔹 2) Enable Caching in Hibernate
Configure Hibernate properties (e.g., in hibernate.cfg.xml, application.properties, or Spring config):

# Enable second-level cache
hibernate.cache.use_second_level_cache=true
# Enable query cache (optional)
hibernate.cache.use_query_cache=true
# Set cache region factory for Ehcache
hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory

🔹 3) Configure Cache Provider
Create an ehcache.xml file (in src/main/resources) to define cache regions and settings:

<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
  <diskStore path="java.io.tmpdir"/>

  <defaultCache
      maxElementsInMemory="1000"
      eternal="false"
      timeToIdleSeconds="300"
      timeToLiveSeconds="600"
      overflowToDisk="true"/>

  <cache name="com.myapp.model.MyEntity"
         maxElementsInMemory="500"
         eternal="false"
         timeToIdleSeconds="300"
         timeToLiveSeconds="600"
         overflowToDisk="true"/>
</ehcache>

🔹 4) Annotate Entities
Use @Cache on your entities to specify caching for second-level cache:

@Entity
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class MyEntity {
    @Id
    private Long id;
    private String data;
}

Common strategies:

  • READ_ONLY: for immutable data.
  • READ_WRITE: allows safe updates.
  • NONSTRICT_READ_WRITE: less strict concurrency control.

🔹 5) Use Query Cache (Optional)
If you want Hibernate to cache entire query results:

Query<MyEntity> query = session.createQuery("FROM MyEntity", MyEntity.class);
query.setCacheable(true);
List<MyEntity> results = query.getResultList();

📊 Key Steps Summary

StepWhat to do
Add dependencyInclude Ehcache + Hibernate integration libs
Enable cacheSet second-level and query cache properties
Configure providerDefine cache settings in ehcache.xml or Java config
Annotate entitiesUse @Cache with appropriate strategy
Use query cache (opt)Call setCacheable(true) on queries

📌 Key Takeaways

✅ The second-level cache stores entity data across sessions → reduces DB hits.
✅ Ehcache is a popular, easy-to-integrate Hibernate cache provider.
✅ Always use appropriate concurrency strategy to match data mutability.
✅ Remember: second-level cache is shared across sessions, unlike the first-level (session) cache.

This entry was posted in Без рубрики. Bookmark the permalink.