即使我使用的是openSessionInViewInterceptor,我也遇到了LazyInitializationException的问题。我已经阅读了很多关于该主题的帖子,我尝试了三种或四种不同的方法。
首先,我不想在Hibernate配置文件中将lazzy属性设置为false。所以,我想要解决这个问题。我正在使用Spring 2.5,Hibernate 3,Netbeans和Tomcat。
我的实施如下:
servlet.xml中
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="interceptors">
<list>
<ref bean="openSessionInViewInterceptor" />
</list>
</property>
<property name="mappings">
<props>
<prop key="/index.htm">indexController</prop>
</props>
</property>
</bean>
<bean id ="openSessionInViewInterceptor" name="openSessionInViewInterceptor"
class="org.springframework.orm.hibernate3.support.OpenSessionInViewInterceptor">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
的applicationContext.xml
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource">
<ref local="dataSource"/>
</property>
<property name="mappingResources">
<list>
<value>TasquesDAOHibernate/Model/Tasca.hbm.xml</value>
<value>TasquesDAOHibernate/Model/TipusTasca.hbm.xml</value>
<value>TasquesDAOHibernate/Model/Prioritat.hbm.xml</value>
<value>TasquesDAOHibernate/Model/Persona.hbm.xml</value>
<value>TasquesDAOHibernate/Model/EstatTasca.hbm.xml</value>
<value>TasquesDAOHibernate/Model/Usuari.hbm.xml</value>
<value>TasquesDAOHibernate/Model/LogActivitat.hbm.xml</value>
<value>TasquesDAOHibernate/Model/ObjecteSIPANUsuari.hbm.xml</value>
</list>
</property>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">${hibernate.dialect}</prop>
<prop key="hibernate.jdbc.batch_size">0</prop>
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
<bean id="tasquesDAO" class="TasquesDAOHibernate.TasquesDAOHibernate">
<property name="sessionFactory">
<ref local="sessionFactory"/>
</property>
</bean>
<bean id="tasquesService" name="tasquesService" class="Tasques_www.service.TasquesService" >
<property name="tasquesDAO">
<ref local="tasquesDAO"/>
</property>
<property name="transactionManager" ref="transactionManager"/>
</bean>
TasquesService.java
public List<Tasca> getTasques() {
List<Tasca> tasques = (List)this.transactionTemplate.execute(new TransactionCallback() {
public Object doInTransaction(TransactionStatus status) {
Object tasques = tasquesDAO.getTasques();
return tasques;
}
});
return tasques;
}
TasquesDAOHibernate.java
public List<Tasca> getTasques() {
Session session = this.sessionFactory.getCurrentSession();
try{
Query query = session.createQuery("SELECT element FROM Tasca AS element");
List result = query.list();
return result;
}catch(HibernateException ex){
return null;
}
}
我认为那些是重要文件。我尝试了很多东西,而且我总是得到LazyInitializationException或
org.hibernate.HibernateException:没有Hibernate会话绑定到线程,配置不允许在这里创建非事务性的 ...
我不知道哪一个最差。
提前致谢!
答案 0 :(得分:1)
我认为您需要 web.xml 级别的过滤器:
<filter>
<filter-name>Spring OpenEntityManagerInViewFilter</filter-name>
<filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
</filter>
只有这样,春天才能知道你的视图何时呈现。
答案 1 :(得分:1)
问题是您使用事务管理器:这将启动一个新会话,并且由于您手动打开它,它也将关闭它。您需要使用Springs配置来配置事务管理,以便所有组件可以一起正常工作。
在业务层(TasqueService)上使用事务拦截器。
答案 2 :(得分:0)
您可以尝试使用Spring中的本地拦截器来查看我的
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory">
<ref bean="sessionFactory" />
</property>
</bean>
<bean id="txAttributeSource"
class="org.springframework.transaction.interceptor.NameMatchTransactionAttributeSource">
<property name="properties">
<props> <!-- this catches every method with the interceptor-->
<prop key="*">PROPAGATION_REQUIRED</prop>
</props>
</property>
</bean>
<bean id="txInterceptor"
class="org.springframework.transaction.interceptor.TransactionInterceptor">
<property name="transactionManager">
<ref local="transactionManager" />
</property>
<property name="transactionAttributeSource">
<ref local="txAttributeSource" />
</property>
</bean>
<bean id="autoProxyCreator" class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">
<property name="interceptorNames">
<list>
<idref local="txInterceptor" />
</list>
</property>
<property name="beanNames">
<list> <!--this proxies every bean with the especified pattern -->
<value>*BL</value>
</list>
</property>
</bean>
答案 3 :(得分:0)
要在整个请求期间保持会话打开,您需要将Spring的OpenSessionInViewFilter添加到您的web.xml中。这个特定于hibernate3:
<filter>
<filter-name>OpenSessionInViewFilter</filter-name>
<filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter>