Выделенная область кэша для подклассов сущностей?

У нас есть обширная модель сущностей с более чем 100 классами сущностей. Все классы сущностей являются подклассами суперклассов одной сущности. Режим общего кэша был установлен наВСЕ.

@Entity
@Inheritance(strategy = InheritanceType.JOINED)
@Table(name = "entities")
public abstract class LongIdEntity {

  @Id
  @GeneratedValue(strategy = GenerationType.TABLE)
  private Long id;

  @Version
  @Column(name = "OPT_LOCK_VERSION")
  private Long lockVersion;

  etc...

}

Пример подкласса:

@Entity
@Table(name = "cars")
public class Car extends LongIdEntity { ... }

Мы хотели бы кэшировать все сущности в кеше 2-го уровня. Проблема в том, что для всех сущностей создается только 1 область кэша; названныйLongIdEntity.

Отладка показывает Hibernateсделал найти все классы сущностей, но в любом случае назначить им один и тот же регион. Потому что вSessionFactoryImpl: 339 :

String cacheRegionName = cacheRegionPrefix + model.getRootClass().getCacheRegionName();

В нашем случае звонок наmodel.getRootClass () всегда уступитLongIdEntity».

Я предполагаю, что это действительно кеширует все сущности, но без какого-либо контроля над выселением. Некоторые занятия очень часты и доступны только для чтения. Поэтому мы хотим сохранить их в памяти. Некоторые из них, как правило, используются в определенный промежуток времени и т. Д. Заставление всего этого в один и тот же кеш делает его недействительным

Указание региона в аннотации не имеет никакого эффекта. Например:

@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE,region = "cars")
@Entity
@Table(name = "cars")
public class Car extends LongIdEntity { ... }

Странно то, что только режим общего кэшаВСЕ подбирает классы сущностей. В любом другом режиме нет сущностей - даже если они аннотированы @Cache и / или @Cacheable. Может быть, это указание?

У кого-то есть идея, как я могу назначить определенные классы сущностей определенным регионам?

TIA :-)

persistence.xml элементарно:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">
  <persistence-unit name="cars" transaction-type="RESOURCE_LOCAL">
    <shared-cache-mode>ALL</shared-cache-mode>
  </persistence-unit>
</persistence>

Сессионная фабрика выполнена классическим способом:

  <bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="persistenceProviderClass" value="org.hibernate.ejb.HibernatePersistence"/>
    <property name="persistenceUnitName" value="optimus"/>
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaProperties">
      <props>
        <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</prop>
        <prop key="hibernate.cache.use_second_level_cache">true</prop>
        <prop key="hibernate.cache.use_query_cache">true</prop>
        <prop key="hibernate.generate_statistics">true</prop>
        <prop key="hibernate.cache.default_cache_concurrency_strategy">NONSTRICT_READ_WRITE</prop>
        <prop key="hibernate.hbm2ddl.auto">update</prop>
        <prop key="hibernate.jdbc.batch_size">1000</prop>
        <prop key="hibernate.show_sql">false</prop>
        <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</prop>
        <prop key="hibernate.search.default.directory_provider">filesystem</prop>
        <prop key="hibernate.search.default.indexBase">/hibernate-search</prop>
      </props>
    </property>
  </bean>

Окружение

JDK6Linux x64Hibernate 4.1.10Весна 3.2.1

ОБНОВЛЕНИЕ: используйте @MappedSuperclass

@MappedSuperclass
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class LongIdEntity { ... }

Тоже ничего не меняет.

Ответы на вопрос(2)

Ваш ответ на вопрос