gpt4 book ai didi

hibernate - 实体子类的专用缓存区域?

转载 作者:行者123 更新时间:2023-12-04 07:04:40 26 4
gpt4 key购买 nike

我们有一个包含100多个实体类的广泛实体模型。所有实体类都是单个实体父类(super class)的子类。共享缓存模式已设置为 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确实找到了所有实体类,但是无论如何都将它们分配给相同的区域。因为在 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 { ... }

奇怪的是,只有共享缓存模式 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>

session 工厂被制成经典方式:
  <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
  • hibernate 4.1.10
  • Spring 3.2.1

  • 更新:使用@MappedSuperclass
    @MappedSuperclass
    @Inheritance(strategy = InheritanceType.JOINED)
    public abstract class LongIdEntity { ... }

    也不改变任何事情。

    最佳答案

    Hibernate将整个实体层次结构明确地缓存在一个区域中。无法对此进行控制。这是正确处理多态查询的缓存分辨率的唯一方法。其他提供程序(我认为)确实允许对每个子类的缓存位置/方式进行一些控制(至少我基于JPA提供的选项进行了猜测)。

    关于hibernate - 实体子类的专用缓存区域?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15294394/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com