它是我的第一个非常简单的Spring-Hibernate应用程序。
我得到了这个
'无法获取当前线程的事务同步会话'错误
当我试图从SessionFactory获取当前会话时。
我尝试了以下事情..
我的root-context.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-
context.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
<!-- <context:property-placeholder
location="classpath:../properties/db.properties" /> -->
<bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/hib" />
<property name="username" value="root" />
<property name="password" value="" />
</bean>
<bean id="sessionFactory"
class="org.springframework.orm.hibernate5.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<property name="packagesToScan" value="com.nin.entity" />
<property name="hibernateProperties">
<props>
<prop
key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.default_schema">hib</prop>
</props>
</property>
<tx:annotation-driven transaction-manager="TransactionManager" />
<bean id="TransactionManager"
class="org.springframework.orm.hibernate5.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" >
<property name="prefix">
<value>/WEB-INF/view/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
我的dispatcherServlet.xml
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:mvc="http://www.springframework.org/schema/mvc"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.1.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-
3.1.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-
context-3.1.xsd">
<context:component-scan base-package="com.nin"></context:component-scan>
<mvc:annotation-driven/>
</beans>
我的Dao课
package com.nin.dao;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import com.nin.entity.Student;
@Repository
public class DaoImpl {
@Autowired
private SessionFactory sf;
@Transactional
public void register (Student st){
sf.getCurrentSession(); //Getting Error at this line.
// Session session = sf.getCurrentSession();
// session.save(st);
}
}
最后我的实体类
package com.nin.entity;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;
@Entity
@Table(name="student")
public class Student {
@Column(name="name")
private String name;
@Id
@Column(name="rollno")
private String rollno;
@Column(name="password")
private String password;
@Column(name="city")
private String city;
public Student(){};
//and getters and setters..
提前致谢,对不起我的英语&amp;问题的表示。
答案 0 :(得分:1)
问题是您的Hibernate和事务配置位于ContextLoaderListener
加载的配置文件中。由于该文件中的DispatcherServlet
,您的组件由<component-scan />
加载。
当使用交易这些通过AOP应用的东西时。 AOP通过后处理bean应用。后处理仅适用于相同上下文中的bean,否则您可能会得到奇怪的结果。
由于你没有2个上下文,AOP的内容与你想要应用AOP的实际组件不同。
您可以将所有内容放在单个上下文中,也可以将<context:component-scan />
移动到包含事务配置的配置中。
注意:如果配置文件中有相同的<component-scan />
,则所有组件都将加载两次,并且最近使用组件(在本例中为控制器)你有同样的问题。