Hi I'm experiencing this issue when calling a stored procedure. At first it works and then after a few calls it can no longer map the entity. I think it has something to do with caching. The cache expires and then it tries to load the entity directly. The sp is accessing the table through another DB. So it obviously can't find the table.
Is caching supported for entities loaded through "named queries/stored procs"?
Using Hibernate 3.2.6 ga
MS SQL 2005
The mapping files...
Code:
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<sql-query name="selectGetXYZ" callable="true">
<return alias="aliasXYZ" class="com.mycompany.abc.domain.XYZ">
<return-property name="id" column="Id" />
<return-property name="a" column="A" />
<return-property name="b" column="B" />
<return-property name="c" column="C" />
<return-property name="d" column="D" />
<return-property name="e" column="E" />
<return-property name="f" column="F" />
<return-property name="g" column="G" />
<return-property name="h" column="H" />
<return-property name="i" column="I" />
</return>
{ call GetXYZ() }
</sql-query>
</hibernate-mapping>
<?xml version="1.0"?>
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
<hibernate-mapping>
<class name="com.mycompany.abc.domain.XYZ" >
<cache usage="read-write" />
<id name="id" column="`Id`">
<generator class="assigned"></generator>
</id>
<property name="a" column="`A`" />
<property name="b" column="`B`" />
<property name="c" column="`C`" />
<property name="d" column="`D`" />
<property name="e" column="`E`" />
<property name="f" column="`F`" />
<property name="g" column="`G`" />
<property name="h" column="`H`" />
<property name="i" column="`I`" />
</class>
</hibernate-mapping>
<cache name="com.mycompany.abc.domain.XYZ"
maxElementsInMemory="8" eternal="false" timeToIdleSeconds="7200"
timeToLiveSeconds="10000" overflowToDisk="false" />
The stored proc...
Code:
ALTER PROCEDURE [dbo].[GetXYZ]
AS
BEGIN
select id, a, b, c, d, e, f, g, h, i
from someotherDB..XYZ with (nolock) where h = 1 order by i asc
END
The exception...
Code:
[2010-04-19 21:21:48.810] Thread:pool-3-thread-84 - Unexpected exception processing transaction:com.mycompany.abc.domain.exception.TransactionProcessException: could not load an entity: [com.mycompany.abc.domain.XYZ#1]
at com.mycompany.abc.domain.logic.TransactionManagerImpl.logEnrollmentTransactionError(TransactionManagerImpl.java:572)
at com.mycompany.abc.domain.logic.TransactionManagerImpl.VerifyEnrollment(TransactionManagerImpl.java:208)
at com.mycompany.abc.services.broker.ThreeDHandler.messageReceived(ThreeDHandler.java:50)
at org.jboss.netty.channel.SimpleChannelHandler.handleUpstream(SimpleChannelHandler.java:98)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:560)
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:796)
at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:358)
at com.mycompany.abc.services.broker.MessageEncoderDecoder.handleUpstream(MessageEncoderDecoder.java:71)
at org.jboss.netty.channel.DefaultChannelPipeline.sendUpstream(DefaultChannelPipeline.java:560)
at org.jboss.netty.channel.DefaultChannelPipeline$DefaultChannelHandlerContext.sendUpstream(DefaultChannelPipeline.java:796)
at org.jboss.netty.handler.execution.ChannelEventRunnable.run(ChannelEventRunnable.java:70)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:911)
at java.lang.Thread.run(Thread.java:619)
Caused by: org.hibernate.exception.SQLGrammarException: could not load an entity: [com.mycompany.abc.domain.XYZ#1]
at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:67)
at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:43)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1874)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:48)
at org.hibernate.loader.entity.AbstractEntityLoader.load(AbstractEntityLoader.java:42)
at org.hibernate.persister.entity.AbstractEntityPersister.load(AbstractEntityPersister.java:3049)
at org.hibernate.event.def.DefaultLoadEventListener.loadFromDatasource(DefaultLoadEventListener.java:399)
at org.hibernate.event.def.DefaultLoadEventListener.doLoad(DefaultLoadEventListener.java:375)
at org.hibernate.event.def.DefaultLoadEventListener.load(DefaultLoadEventListener.java:139)
at org.hibernate.event.def.DefaultLoadEventListener.proxyOrLoad(DefaultLoadEventListener.java:195)
at org.hibernate.event.def.DefaultLoadEventListener.onLoad(DefaultLoadEventListener.java:103)
at org.hibernate.impl.SessionImpl.fireLoad(SessionImpl.java:878)
at org.hibernate.impl.SessionImpl.internalLoad(SessionImpl.java:846)
at org.hibernate.type.EntityType.resolveIdentifier(EntityType.java:557)
at org.hibernate.type.ManyToOneType.assemble(ManyToOneType.java:196)
at org.hibernate.cache.StandardQueryCache.get(StandardQueryCache.java:130)
at org.hibernate.loader.Loader.getResultFromQueryCache(Loader.java:2163)
at org.hibernate.loader.Loader.listUsingQueryCache(Loader.java:2126)
at org.hibernate.loader.Loader.list(Loader.java:2096)
at org.hibernate.loader.custom.CustomLoader.list(CustomLoader.java:289)
at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1695)
at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142)
at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152)
at com.mycompany.abc.dao.hibernate.XYZDAOHibernate.findByPriorityAsc(XYZDAOHibernate.java:28)
at com.mycompany.abc.domain.logic.EncryptionManagerImpl.Encrypt(EncryptionManagerImpl.java:37)
at com.mycompany.abc.domain.logic.TransactionManagerImpl.logEnrollmentTransaction(TransactionManagerImpl.java:457)
at com.mycompany.abc.domain.logic.TransactionManagerImpl.VerifyEnrollment(TransactionManagerImpl.java:181)
... 12 more
Caused by: java.sql.SQLException: Invalid object name 'XYZ'.
at net.sourceforge.jtds.jdbc.SQLDiagnostic.addDiagnostic(SQLDiagnostic.java:368)
at net.sourceforge.jtds.jdbc.TdsCore.tdsErrorToken(TdsCore.java:2816)
at net.sourceforge.jtds.jdbc.TdsCore.nextToken(TdsCore.java:2254)
at net.sourceforge.jtds.jdbc.TdsCore.getMoreResults(TdsCore.java:631)
at net.sourceforge.jtds.jdbc.JtdsStatement.executeSQLQuery(JtdsStatement.java:477)
at net.sourceforge.jtds.jdbc.JtdsPreparedStatement.executeQuery(JtdsPreparedStatement.java:777)
at org.hibernate.jdbc.AbstractBatcher.getResultSet(AbstractBatcher.java:186)
at org.hibernate.loader.Loader.getResultSet(Loader.java:1787)
at org.hibernate.loader.Loader.doQuery(Loader.java:674)
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:236)
at org.hibernate.loader.Loader.loadEntity(Loader.java:1860)
... 36 more