Выделенная область кэша для подклассов сущностей?
У нас есть обширная модель сущностей с более чем 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 { ... }
Тоже ничего не меняет.