【问题标题】:How do I configure a lazy-loaded collection to utilize my Hibernate second level cache?如何配置延迟加载集合以利用我的 Hibernate 二级缓存?
【发布时间】:2017-08-23 23:46:26
【问题描述】:

我正在使用带有 Hibernate 5.1.5.Final 的 Java 7。我试图弄清楚如何缓存由于加载惰性集合而发生的查询。这是我的实体...

@Entity
@Table(name = "my_item")
@Cache(usage=CacheConcurrencyStrategy.NONSTRICT_READ_WRITE)
public class MyItem implements Serializable, Comparable<MyItem>

...

    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name = "PARENT_ID")
    @OrderBy("orderNumber")
    private Set<MyItem> children = new TreeSet<MyItem>();

...
    public Set<MyItem> getChildren() {
        return children;
    }

我的二级缓存是这样配置的(通过 Spring)......

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="packagesToScan" value="org.collegeboard.springboard" />
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
    </property>
    <property name="dataSource" ref="dataSource"/>
    <property name="jpaPropertyMap" ref="jpaPropertyMap" />
</bean>

<util:map id="jpaPropertyMap">
    <entry key="hibernate.show_sql" value="false" />
    <entry key="hibernate.hbm2ddl.auto" value="validate"/>
    <entry key="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect"/>
    <entry key="hibernate.transaction.manager_lookup_class" value="org.hibernate.transaction.JBossTransactionManagerLookup" />
    <entry key="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/>
    <entry key="hibernate.cache.provider_class" value="org.hibernate.cache.EhCacheProvider"/>
    <entry key="hibernate.cache.use_second_level_cache" value="true" />
    <entry key="hibernate.cache.use_query_cache" value="${enable.hibernate.query.cache}" />
    <entry key="hibernate.generate_statistics" value="false" />
    <entry key="hibernate.event.merge.entity_copy_observer" value="allow" />
    <entry key="hibernate.enable_lazy_load_no_trans" value="true" />
</util:map>

虽然实体本身标有“@Cache”注释,但调用“getChildren”会导致查询。如何配置我的实体(或应用程序)以利用缓存?

【问题讨论】:

    标签: hibernate jpa caching lazy-loading


    【解决方案1】:

    发现@Cache注解是这样做的方法...

    @OneToMany(fetch = FetchType.LAZY)
    @JoinColumn(name = "PARENT_ID")
    @OrderBy("orderNumber")
    @Cache(usage=CacheConcurrencyStrategy.TRANSACTIONAL)
    private Set<MyItem> children = new TreeSet<MyItem>();
    

    【讨论】:

      猜你喜欢
      • 2011-01-18
      • 2015-02-15
      • 1970-01-01
      • 2016-12-21
      • 1970-01-01
      • 1970-01-01
      • 2014-09-11
      • 1970-01-01
      • 2014-10-18
      相关资源
      最近更新 更多