Spring Hibernate事务无会话延迟加载
我只有一个控制器有一个延迟加载实体的问题(有一个事务已启动并提交,请参阅堆栈跟踪)Spring Hibernate事务无会话延迟加载,spring,hibernate,Spring,Hibernate,我只有一个控制器有一个延迟加载实体的问题(有一个事务已启动并提交,请参阅堆栈跟踪) 17:56:46084调试HibernateTransactionManager:438-找到线程绑定会话[org.hibernate.impl。SessionImpl@6b204e88]用于Hibernate事务 17:56:46085调试HibernateTransactionManager:471-参与现有事务 17:56:46085调试HibernateTransactionManager:438-找到线
17:56:46084调试HibernateTransactionManager:438-找到线程绑定会话[org.hibernate.impl。SessionImpl@6b204e88]用于Hibernate事务
17:56:46085调试HibernateTransactionManager:471-参与现有事务
17:56:46085调试HibernateTransactionManager:438-找到线程绑定会话[org.hibernate.impl]。SessionImpl@6b204e88]用于Hibernate事务
17:56:46085调试HibernateTransactionManager:471-参与现有事务
Hibernate:选择preference0.id作为id66,选择preference0.name作为name66,选择preference0.value作为value66,选择preference0.default作为default4,选择preference0.updated作为updated5,选择preference0.updated作为preference0,其中preference0.name='scheduleInterval'
17:56:46086调试GooGooStatementCache:457-cxnStmtMgr.statementSet(com.mysql.jdbc)。JDBC4Connection@5ec60ee2).size():21
17:56:46086调试GoogoStatementCache:196-checkoutStatement:com.mchange.v2.c3p0.stmt.GlobalMaxOnlyStatementCache stats-总大小:111;退房:1;连接数:10;数字键:111
17:56:46087调试GoogoStatementCache:271-CheckInstaement():com.mchange.v2.c3p0.stmt.GlobalMaxOnlyStatementCache统计数据--总大小:111;已签出:0;连接数:10;数字键:111
17:56:46089致命应用程序:79-服务
org.hibernate.LazyInitializationException:无法初始化代理-无会话
位于org.hibernate.proxy.AbstractLazyInitializer.initialize(AbstractLazyInitializer.java:167)
位于org.hibernate.proxy.AbstractLazyInitializer.getImplementation(AbstractLazyInitializer.java:215)
位于org.hibernate.proxy.pojo.javassist.JavassistLazyInitializer.invoke(JavassistLazyInitializer.java:190)
在com.model.User\u$$\ uJavassist\u76.getName(User\u$$\ uJavassist\u76.java)
位于com.model.json.ScheduleItemWrapper.wrap(ScheduleItemWrapper.java:55)
位于com.web.controllers.ajax.Model.wrap(Model.java:127)
位于com.web.controllers.ajax.Model.toJSON(Model.java:165)
位于com.web.controllers.ajax.Model.getContent(Model.java:51)
位于com.web.controllers.ajax.BasicAction.execute(BasicAction.java:27)
位于com.web.HibernateServlet.doService(HibernateServlet.java:113)
位于com.web.HibernateServlet.service(HibernateServlet.java:66)
位于sun.reflect.GeneratedMethodAccessor200.invoke(未知源)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:597)
位于org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:317)
位于org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)
位于org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:695)
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:150)上
位于org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:96)
位于org.springframework.transaction.interceptor.TransactionSpectSupport.invokeWithinTransaction(TransactionSpectSupport.java:260)
位于org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:94)
在org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:161)上
位于org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:91)
位于org.springframework.aop.framework.ReflectiveMethodInvocation.procedue(ReflectiveMethodInvocation.java:172)
位于org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:631)
在com.levitech.web.controllers.ScheduleList$$enhancerbyglib$$4a7ae33e.service()上
位于com.levitech.web.RequestDispatcher.service(RequestDispatcher.java:63)
位于javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
位于org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
位于org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
位于org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
位于org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
位于org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
位于org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
位于org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
位于org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
位于org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:859)
位于org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:602)
位于org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
运行(Thread.java:662)
17:56:46090调试HibernateTransactionManager:753-启动事务提交
17:56:46090调试HibernateTransactionManager:653-在会话[org.Hibernate.impl]上提交Hibernate事务。SessionImpl@6b204e88]
17:56:46091调试HibernateTransactionManager:735-关闭Hibernate会话[org.Hibernate.impl。SessionImpl@6b204e88]交易后
17:56:46091调试会话FactoryUtils:800-关闭休眠会话
模型(ScheduleItem和User)及其hibernate映射
public class ScheduleItem {
private Integer id;
....
private User user;
}
public class User {
private Integer id;
...
private String name;
}
<class
name="ScheduleItem"
table="schedule_item"
>
<cache usage="read-write"/>
<id
name="id"
type="integer"
column="id"
>
<generator class="identity" />
</id>
<many-to-one name="user" column="user_id" lazy="proxy"></many-to-one>
</class>
<class
name="ScheduleItem"
table="schedule_item"
>
<cache usage="read-write"/>
<id
name="id"
type="integer"
column="id"
>
<generator class="identity" />
</id>
<property name="name" column="name" type="string" />
</class>
公共类ScheduleItem{
私有整数id;
....
私人用户;
}
公共类用户{
私有整数id;
...
私有字符串名称;
}
我找到了罪犯。OpenSessionViewFilter正在使用不同的se
public class ScheduleItem {
private Integer id;
....
private User user;
}
public class User {
private Integer id;
...
private String name;
}
<class
name="ScheduleItem"
table="schedule_item"
>
<cache usage="read-write"/>
<id
name="id"
type="integer"
column="id"
>
<generator class="identity" />
</id>
<many-to-one name="user" column="user_id" lazy="proxy"></many-to-one>
</class>
<class
name="ScheduleItem"
table="schedule_item"
>
<cache usage="read-write"/>
<id
name="id"
type="integer"
column="id"
>
<generator class="identity" />
</id>
<property name="name" column="name" type="string" />
</class>
<filter>
<filter-name>hibernateFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
<init-param>
<param-name>sessionFactoryBeanName</param-name>
<param-value>sessionFactory</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>hibernateFilter</filter-name>
<url-pattern>/app/s/*</url-pattern>
</filter-mapping>
<bean id="myDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
<property name="driverClass" value="${db.driver}"/>
<property name="jdbcUrl" value="${db.url}"/>
<property name="user" value="${db.user}"/>
<property name="password" value="${db.pass}"/>
<!-- Pool properties -->
<property name="minPoolSize" value="5" />
<property name="maxPoolSize" value="100" />
<property name="acquireIncrement" value="5" />
<property name="maxStatements" value="200" />
<property name="idleConnectionTestPeriod" value="120" />
<property name="maxIdleTime" value="1800" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="myDataSource"></property>
<property name="mappingLocations" value="classpath*:com/model/hbm/**/*.hbm.xml" />
<property name="hibernateProperties">
<value>
hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
hibernate.show_sql=true
hibernate.cache.region.factory_class=net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory
hibernate.cache.use_query_cache=true
hibernate.cache.use_second_level_cache=true
</value>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
User user = session.load(User.class, 1000); // Create a proxy
user.getName(); // This would throw lazy initialization exception if row doesn't exist