Hibernate L2 cache умирает

Всем доброго дня! Никак не могу добиться "вечно живого" кеша 2 уровня Hibernate...

Есть приложение Spring boot. Есть сущность Country - не изменяется никогда (справочник). Эта сущность связана с другими как вложенная и в нескольких "родительских" сущностях вытягивается как EAGER (приложение старое, давно в проде и менять что-то здесь - не вариант).

Дабы сэкономить ресурсы и время принято решение закешировать Country. Сделано следующее:

  1. Добавлены зависимости
        <dependency>
            <groupId>org.ehcache</groupId>
            <artifactId>ehcache</artifactId>
            <version>3.9.6</version>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-jcache</artifactId>
            <version>5.4.29.Final</version>
        </dependency>
  1. Добавлена конфигурация
hibernate.cache.use_second_level_cache=true
hibernate.cache.use_query_cache=true
hibernate.cache.provider_class=org.ehcache.jsr107.EhcacheCachingProvider
hibernate.cache.region.factory_class=org.hibernate.cache.jcache.JCacheRegionFactory
javax.persistence.sharedCache.mode=ENABLE_SELECTIVE
hibernate.javax.cache.uri=/ehcache.xml
hibernate.generate_statistics=true
hibernate.format_sql=true
logging.level.org.hibernate.SQL=DEBUG
logging.level.org.hibernate.type=trace
  1. Сущность, которую нужно кешировать, снабжена аннотациями javax.persistence.Cacheable и org.hibernate.annotations.Cache и выглядит тепреь так:
    @Entity
    @Cacheable
    @Cache(usage = CacheConcurrencyStrategy.READ_ONLY, region = "Country")
    public class Country extends BaseEntity {
    
    @Column(nullable = false, unique = true, columnDefinition = "VARCHAR(73)")
    private String name;
    
    @JsonIgnore
    @Column(nullable = false, unique = true, columnDefinition = "VARCHAR(40)")
    private String nameRu;
    
    @JsonIgnore
    @Column(nullable = false, unique = true, columnDefinition = "VARCHAR(33)")
    private String nameEn;
    
    @Column(nullable = false, columnDefinition = "VARCHAR(4)")
    private String phonePrefix;
    
    @Column(nullable = false, unique = true, columnDefinition = "CHAR(2)")
    private String code;
    
    }
  1. Файл конфигурации кеша выглядит так:
<?xml version="1.0" encoding="UTF-8"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns="http://www.ehcache.org/v3"
xmlns:jsr107="http://www.ehcache.org/v3/jsr107"
xsi:schemaLocation="
                http://www.ehcache.org/v3
                http://www.ehcache.org/schema/ehcache-core.xsd
                http://www.ehcache.org/v3/jsr107
                http://www.ehcache.org/schema/ehcache-107-ext.xsd">
<service>
<jsr107:defaults enable-management="true" enable-statistics="true" default-template="default"/>
</service>
<cache-template name="default">
        <expiry>
            <ttl>300</ttl>
        </expiry>
        <heap>1024</heap>
    </cache-template>
    <cache alias="default-query-results-region" uses-template="default"/>
    <cache alias="default-update-timestamps-region" uses-template="default">
        <expiry>
            <none/>
        </expiry>
    </cache>
    <cache alias="Country" uses-template="default">
        <expiry>
            <none/>
        </expiry>
    </cache>
    </config>

Запускаю, смотрю в javaMelody. Делаю запрос postman-ом сущности, в которую Country входит

    @ManyToOne(optional = false, fetch = FetchType.EAGER)
    @JoinColumn(nullable = false, name = "country_id", columnDefinition = "BIGINT DEFAULT 1")
    private Country country;

Вижу, что прошел запрос на выборку country по id. Делаю еще несколько запросов постманом. В javaMelody кол-во запросов country не увеличивается. Зато растет цифра % of efficiency of cache. Жду буквально минуту. Делаю запрос. Кол-во запросов country увеличивается на 1, % of efficiency of cache уменьшается. Т.е. кеш создается и работает, но мне нужно чтобы он жил вечно, а он умирает. Вернее - не умирает, а чистится.

Подскажите, что делаю не так?


Ответы (1 шт):

Автор решения: Adm123

Решение. Нужно пометить сущность аннотацией @org.hibernate.annotations.Immutable

→ Ссылка