我正在尝试使用Spring 3.1和Hibernate 4设置项目。我一直在在线关注一些教程。我收到一个奇怪的错误,根据Spring论坛,应该使用Spring 3.1进行修复。 Spring Bug Tracker
当我的服务调用时getCurrentSession(),它将引发以下异常:
getCurrentSession()
org.hibernate.HibernateException: **No Session found for current thread**] with root cause org.hibernate.HibernateException: No Session found for current thread at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:97) at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:881)
编辑:根据Spring Spring 3.1 Transactions文档更新了我的spring-dao.xml 。我试图用org.apache.commons.dbcp.BasicDataSource换出我的数据源。我的配置中缺少任何可能导致此问题的属性吗?****
这是我的spring-dao.xml:
<!-- Enable annotation style of managing transactions --> <tx:annotation-driven transaction-manager="transactionManager" /> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource" /> <property name="hibernateProperties"> <value>hibernate.dialect=org.hibernate.dialect.MySQLInnoDBDialect</value> </property> </bean> <!-- Declare a datasource that has pooling capabilities--> <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close" p:driverClass="${app.jdbc.driverClassName}" p:jdbcUrl="${app.jdbc.url}" p:user="${app.jdbc.username}" p:password="${app.jdbc.password}" p:acquireIncrement="5" p:idleConnectionTestPeriod="60" p:maxPoolSize="100" p:maxStatements="50" p:minPoolSize="10" /> <!-- Declare a transaction manager--> <bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager" p:sessionFactory-ref="sessionFactory" />
我的用户bean(User.java)
package com.foo.lystra.beans; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.Table; @Entity @Table(name="users") public class User implements Serializable { private static final long serialVersionUID = -5527566191402296042L; @Id @Column(name = "idusers") private Integer user_id; @Column(name="login_name") private String loginName; @Column(name="password") private String password; @Column(name="role") private String role; @Column(name="congregation_id") private Integer congregation_id; public Integer getUser_id() { return user_id; } public void setUser_id(Integer user_id) { this.user_id = user_id; } public String getLoginName() { return loginName; } public void setLoginName(String loginName) { this.loginName = loginName; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getRole() { return role; } public void setRole(String role) { this.role = role; } public Integer getCongregation_id() { return congregation_id; } public void setCongregation_id(Integer congregation_id) { this.congregation_id = congregation_id; } public String toString() { return "user_name: " + this.loginName + " congregation_id: " + this.congregation_id.toString(); } }
最后是我的服务…
package com.foo.lystra.services; import java.util.List; import javax.annotation.Resource; import org.apache.commons.logging.LogFactory; import org.apache.commons.logging.Log; import org.hibernate.Query; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import com.foo.lystra.beans.User; import com.foo.lystra.beans.Congregation; @Service("congregationUserService") @Transactional public class CongregationUserService { protected static Log logger = LogFactory.getLog(CongregationUserService.class); @Resource(name="sessionFactory") private SessionFactory sessionFactory; public List<User> getAllUsers() { logger.debug("getting all users"); //Exception is thrown on this next line: Session session = sessionFactory.getCurrentSession(); Query query = session.createQuery("FROM users"); return query.list(); } }
我意识到我的数据源可能没有被使用。如果我忘记包括任何配置,则可以更新此帖子。另外,如果需要Tomcat启动日志,我也可以提供它们。
我在spring-4.0.6和hibernate-4.3.6中遇到了这个问题。
解决方案是将所有注释驱动的,组件扫描的,注释驱动的指令从root-context.xml移到servlet-context.xml:
<mvc:annotation-driven /> <context:component-scan base-package="ru.dd.demo" /> <tx:annotation-driven transaction-manager="transactionManager" />
仍然可以在root-context.xml中定义dataSource,sessionFactory和transactionManager。
我在Web应用程序中有同样的问题。问题在于这两个配置文件中都存在:application-context.xml和webmvc-context.xml。webmvc-context.xml在application-context.xml之后加载。我认为在加载application-context.xml时,首先使用事务引用来加载DAO类,但是在加载webmvc-context.xml时,它将被另一个对象替换,而没有事务引用。无论如何,我可以通过扫描特定的程序包解决问题:
<context:component-scan base-package="com.app.repository" />
application-context.xml和
<context:component-scan base-package="com.app.web" /> webmvc-context.xml。
<context:component-scan base-package="com.app.web" />