| After upgrading from Hibernate 3.6 to 5.0.11 we started having issues with second level cache (used EHCache) when maxElementsInMemory is reached and overflowToDisk is enabled. Then a query fails (see an attached stacktrace). Hibernate is not able to access private modifier of composite PK. Failing test case: https://github.com/peterjurkovic/hibernate-test-case-templates/tree/master/orm/hibernate-orm-5
public class Report extends BaseReport{
private ReportPk pk;
public ReportPk getPk() {...}
public void setPk(ReportPk pk) {...}
@Override
public int hashCode() { ... }
@Override
public boolean equals(Object obj) { ... }
}
public class ReportPk implements Serializable{
private Date date;
private String reason;
public Date getDate() { ... }
public void setDate(Date date) {...}
public String getCompanyId() {...}
public void setCompanyId(String companyId) {...}
@Override
public int hashCode() { ... }
@Override
public boolean equals(Object obj) { ... }
}
ehcache-report.xml
<?xml version="1.0" encoding="UTF-8"?>
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd"
name="report" updateCheck="false">
<diskStore path="java.io.tmpdir/some_location"/>
<defaultCache
maxElementsInMemory="XXX"
eternal="false"
timeToIdleSeconds="XXX"
timeToLiveSeconds="XXX"
overflowToDisk="true"
maxElementsOnDisk="XXX"
diskPersistent="false"
diskExpiryThreadIntervalSeconds="XXX"
memoryStoreEvictionPolicy="LRU"
/>
</ehcache>
report-context.xml
...
<property name="mappingResources">
<list>
<value>Report.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.connection.release_mode">auto</prop>
<prop key="hibernate.jdbc.batch_size">20</prop>
<prop key="hibernate.cache.use_query_cache">true</prop>
<prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>
<prop key="hibernate.cache.use_second_level_cache">true</prop>
<prop key="hibernate.bytecode.use_reflection_optimizer">false</prop>
<prop key="ehcache-hibernate.instance-name">report</prop>
<prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
<prop key="net.sf.ehcache.configurationResourceName">ehcache-report.xml</prop>
</props>
</property>
...
Report.hbm.xml
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping default-access="field">
<class name="com.demo.app.Report" table="report">
<cache usage="read-write" />
<composite-id name="pk" class="com.demo.app.ReportPk" >
<key-property name="date" />
<key-property name="reason" />
</composite-id>
<property name="total"/>
</class>
</hibernate-mapping>
Stacktrace
java.lang.IllegalAccessException: Class org.hibernate.property.access.spi.GetterFieldImpl can not access a member of class com.demo.app.model.ReportPk with modifiers "private"
at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)
at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296)
at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288)
at java.lang.reflect.Field.get(Field.java:390)
at org.hibernate.property.access.spi.GetterFieldImpl.get(GetterFieldImpl.java:39)
at org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValue(AbstractComponentTuplizer.java:58)
at org.hibernate.type.ComponentType.getPropertyValue(ComponentType.java:419)
at org.hibernate.type.ComponentType.isEqual(ComponentType.java:183)
at org.hibernate.cache.internal.OldCacheKeyImplementation.equals(OldCacheKeyImplementation.java:83)
at net.sf.ehcache.store.disk.Segment.cleanUpFailedMarker(Segment.java:976)
at net.sf.ehcache.store.disk.DiskStore.cleanUpFailedMarker(DiskStore.java:181)
at net.sf.ehcache.store.DiskBackedMemoryStore.notifyEvictionFromCache(DiskBackedMemoryStore.java:79)
at net.sf.ehcache.store.MemoryStore.evict(MemoryStore.java:853)
at net.sf.ehcache.store.MemoryStore.removeElementChosenByEvictionPolicy(MemoryStore.java:596)
at net.sf.ehcache.store.MemoryStore.checkCapacity(MemoryStore.java:562)
at net.sf.ehcache.store.MemoryStore.put(MemoryStore.java:262)
at net.sf.ehcache.store.FrontEndCacheTier.get(FrontEndCacheTier.java:203)
at net.sf.ehcache.Cache.searchInStoreWithoutStats(Cache.java:2070)
at net.sf.ehcache.Cache.get(Cache.java:1590)
at org.hibernate.cache.ehcache.internal.regions.EhcacheTransactionalDataRegion.get(EhcacheTransactionalDataRegion.java:95)
at org.hibernate.cache.ehcache.internal.strategy.AbstractReadWriteEhcacheAccessStrategy.putFromLoad(AbstractReadWriteEhcacheAccessStrategy.java:95)
at org.hibernate.cache.ehcache.internal.nonstop.NonstopAwareEntityRegionAccessStrategy.putFromLoad(NonstopAwareEntityRegionAccessStrategy.java:139)
at org.hibernate.engine.internal.TwoPhaseLoad.doInitializeEntity(TwoPhaseLoad.java:208)
at org.hibernate.engine.internal.TwoPhaseLoad.initializeEntity(TwoPhaseLoad.java:128)
at org.hibernate.loader.Loader.initializeEntitiesAndCollections(Loader.java:1133)
at org.hibernate.loader.Loader.processResultSet(Loader.java:992)
at org.hibernate.loader.Loader.doQuery(Loader.java:930)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:336)
at org.hibernate.loader.Loader.doList(Loader.java:2617)
at org.hibernate.loader.Loader.doList(Loader.java:2600)
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2429)
at org.hibernate.loader.Loader.list(Loader.java:2424)
at org.hibernate.loader.criteria.CriteriaLoader.list(CriteriaLoader.java:109)
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1774)
at org.hibernate.internal.CriteriaImpl.list(CriteriaImpl.java:363)
at com.demo.app.finder.ReportFinder.getReports(ReportFinder.java:34)
|