Spring + Hibernate 迁移 - currentSession() 方法抛出异常
Spring + Hibernate migration - currentSession() method throwing exception
我已将 Spring 从 3.1 迁移到 4.1.3,将 Hibernate 3.2 迁移到 4.3.9
作为迁移的一部分,我修改了下面的导入和代码
旧导入
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
新导入
import org.springframework.orm.hibernate4.support.HibernateDaoSupport;
和代码更改
在休眠 3 中我有以下代码
public Session getCurrentSession() {
Session session = getSession();
session.setFlushMode(FlushMode.MANUAL);
return session;
}
现在我已经根据新的jar修改如下
public Session getCurrentSession() {
Session session = currentSession();
session.setFlushMode(FlushMode.MANUAL);
return session;
}
经过上述更改后,我遇到了以下异常
Could not obtain transaction-synchronized Session for current thread
org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:134)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014)
at org.springframework.orm.hibernate4.support.HibernateDaoSupport.currentSession(HibernateDaoSupport.java:129)
我没有在我的应用程序中使用注释
我无法解决问题。请帮助我了解异常的可能原因
我猜你需要为你的 sesssionFactory
添加 transactionManager
:
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="mySessionFactory"/>
</property>
</bean>
其中,mySessionFactory
是您的会话工厂 Bean Id。
如您所说,您没有在项目中使用注释。然后,您必须使用 AOP
在方法级别启用事务管理。
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="select*" read-only="true" />
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="txPointcut" expression="execution(* example.MyClass.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" />
</aop:config>
像这样为您的方法添加事务支持。
如果您使用的是 MAVEN 或 gradle,请在您的 POM 中添加以下条目,或者您可以简单地下载 jar 并将其添加到您的类路径中。
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>
我已将 Spring 从 3.1 迁移到 4.1.3,将 Hibernate 3.2 迁移到 4.3.9
作为迁移的一部分,我修改了下面的导入和代码
旧导入
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
新导入
import org.springframework.orm.hibernate4.support.HibernateDaoSupport;
和代码更改
在休眠 3 中我有以下代码
public Session getCurrentSession() {
Session session = getSession();
session.setFlushMode(FlushMode.MANUAL);
return session;
}
现在我已经根据新的jar修改如下
public Session getCurrentSession() {
Session session = currentSession();
session.setFlushMode(FlushMode.MANUAL);
return session;
}
经过上述更改后,我遇到了以下异常
Could not obtain transaction-synchronized Session for current thread
org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:134)
at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014)
at org.springframework.orm.hibernate4.support.HibernateDaoSupport.currentSession(HibernateDaoSupport.java:129)
我没有在我的应用程序中使用注释
我无法解决问题。请帮助我了解异常的可能原因
我猜你需要为你的 sesssionFactory
添加 transactionManager
:
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
<property name="sessionFactory">
<ref local="mySessionFactory"/>
</property>
</bean>
其中,mySessionFactory
是您的会话工厂 Bean Id。
如您所说,您没有在项目中使用注释。然后,您必须使用 AOP
在方法级别启用事务管理。
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="select*" read-only="true" />
<tx:method name="*" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="txPointcut" expression="execution(* example.MyClass.*(..))" />
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointcut" />
</aop:config>
像这样为您的方法添加事务支持。
如果您使用的是 MAVEN 或 gradle,请在您的 POM 中添加以下条目,或者您可以简单地下载 jar 并将其添加到您的类路径中。
<!-- https://mvnrepository.com/artifact/org.springframework/spring-tx -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>4.3.3.RELEASE</version>
</dependency>