私たちは100以上のエンティティクラスを持つ広範なエンティティモデルを持っています。すべてのエンティティクラスは、単一のエンティティスーパークラスのサブクラスです。共有キャッシュモードはALLに設定されています。エンティティサブクラス用の専用キャッシュ領域?
@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 { ... }
我々は第二レベルのキャッシュ内のすべてのエンティティをキャッシュしたいと思います。問題は、すべてのエンティティに対して1つのキャッシュ領域しか作成されないことです。 LongIdEntityという名前です。
デバッグでは、Hibernate はとなりましたが、すべてのエンティティクラスを検索しますが、それらは同じ領域に割り当てられます。 339::私たちの場合は
String cacheRegionName = cacheRegionPrefix + model.getRootClass().getCacheRegionName();
、model.getRootClass()への呼び出し常に "LongIdEntity" を得られますSessionFactoryImplであるため。
これは、実際にはすべてのエンティティをキャッシュしていますが、エビクションを制御することはできません。いくつかのクラスは非常に頻繁で読み取り専用です。だから我々はそれらをメモリに固定しておきたい。いくつかは通常、特定の期間などで使用されます。同じキャッシュにすべてを詰め込むと、すべてが無効になります。
アノテーション内の領域を指定しても効果はありません。たとえば:
は@Cache(usage = CacheConcurrencyStrategy.NONSTRICT_READ_WRITE,region = "cars")
@Entity
@Table(name = "cars")
public class Car extends LongIdEntity { ... }
奇妙なことは、唯一の共有キャッシュモードはALLは、エンティティクラスをピックアップしていること。他のモードでは、@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>
環境
- JDK6
- のLinux x64の
- 休止4.1.10
- 春3.2.1
UPDATE:使用@MappedSuperclass
@MappedSuperclass
@Inheritance(strategy = InheritanceType.JOINED)
public abstract class LongIdEntity { ... }
は、どちらかのものは変更されません。
[この質問](http://stackoverflow.com/questions/4452242/specifying-global-ehcache-capacity)があなたが持っているものと同じ問題に対処していないことを確認できますか? – mindas
私は本当にその反対をしようとしています。彼は1つの大きなキャッシュを持つことを試みており、私は各エンティティのキャッシュを持つことを試みています。または、この動作を@Cache(region = ....)でオーバーライドします。それは早い時期にそのように働いていましたが、今日は無視されています。 –