[
http://opensource.atlassian.com/projects/hibernate/browse/HHH-2316?page=c...
]
Jifeng Liu updated HHH-2316:
----------------------------
Attachment: cacheTest.zip
I created a test case in the attached zip file. The exception's stack trace is:
org.hibernate.PropertyAccessException: IllegalArgumentException occurred calling getter of
org.hibernate.test.annotations.cidcache.OrderLinePk.firstname
at
org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:171)
at
org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValue(AbstractComponentTuplizer.java:64)
at
org.hibernate.tuple.component.AbstractComponentTuplizer.getPropertyValues(AbstractComponentTuplizer.java:70)
at
org.hibernate.tuple.component.PojoComponentTuplizer.getPropertyValues(PojoComponentTuplizer.java:83)
at org.hibernate.type.ComponentType.getPropertyValues(ComponentType.java:353)
at org.hibernate.type.ComponentType.isEqual(ComponentType.java:123)
at org.hibernate.cache.CacheKey.equals(CacheKey.java:51)
at java.util.HashMap.eq(HashMap.java:299)
at java.util.HashMap.getEntry(HashMap.java:398)
at java.util.LinkedHashMap.get(LinkedHashMap.java:273)
at net.sf.ehcache.store.MemoryStore.get(MemoryStore.java:130)
at net.sf.ehcache.Cache.searchInMemoryStore(Cache.java:819)
at net.sf.ehcache.Cache.get(Cache.java:654)
at org.hibernate.cache.EhCache.get(EhCache.java:74)
at org.hibernate.cache.ReadWriteCache.afterInsert(ReadWriteCache.java:289)
at
org.hibernate.action.EntityInsertAction.afterTransactionCompletion(EntityInsertAction.java:169)
at org.hibernate.engine.ActionQueue.afterTransactionCompletion(ActionQueue.java:170)
at org.hibernate.impl.SessionImpl.afterTransactionCompletion(SessionImpl.java:424)
at org.hibernate.jdbc.JDBCContext.afterTransactionCompletion(JDBCContext.java:225)
at org.hibernate.transaction.JDBCTransaction.commit(JDBCTransaction.java:119)
at
org.hibernate.test.annotations.cidcache.CompositeIdCacheTest.testCache(CompositeIdCacheTest.java:32)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at junit.framework.TestCase.runTest(TestCase.java:154)
at org.hibernate.test.annotations.TestCase.runTest(TestCase.java:68)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at
org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.run(JUnitTestRunner.java:297)
at
org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.launch(JUnitTestRunner.java:672)
at
org.apache.tools.ant.taskdefs.optional.junit.JUnitTestRunner.main(JUnitTestRunner.java:567)
Caused by: java.lang.IllegalArgumentException: object is not an instance of declaring
class
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:585)
at
org.hibernate.property.BasicPropertyAccessor$BasicGetter.get(BasicPropertyAccessor.java:145)
... 36 more
org.hibernate.cache.CacheKey.equals() can cause
PropertyAccessException to be thrown
------------------------------------------------------------------------------------
Key: HHH-2316
URL:
http://opensource.atlassian.com/projects/hibernate/browse/HHH-2316
Project: Hibernate3
Issue Type: Bug
Components: core
Affects Versions: 3.2.1
Environment: Windows XP / Sybase 12.5 / Java 1.5.0_09 / ehcache 1.2.4
Reporter: Joel Caplin
Priority: Critical
Attachments: cacheTest.zip
org.hibernate.cache.CacheKey.equals() uses lazy evaluation in its return clause: it first
calls type.isEqual() and, if true, then calls entityOrRoleName.equals().
I am having difficulty reproducing this bug in the form of a test case owing to the
complexity of our model and the large amount of data in question-- however, in certain
circumstances, where the entityOrRoleName's are NOT equal, calling type.isEqual()
yields a PropertyAccessException.
When this bug manifests itself (a PropertyAccessException is thrown), it causes ALL
future Hibernate requests to throw a similar exception, thus rendering our service
unusable.
This is fixed when the lazy evaluation is done the other way around: call
entityOrRoleName.equals() prior to type.isEqual() - cheap string comparision vs an
expensive call which has a large call tree under it.
--
This message is automatically generated by JIRA.
-
If you think it was sent incorrectly contact one of the administrators:
http://opensource.atlassian.com/projects/hibernate/secure/Administrators....
-
For more information on JIRA, see:
http://www.atlassian.com/software/jira