我在休眠中的会话有问题:
INFO: Starting ProtocolHandler ["http-bio-8080"]
2013-09-10 16:23:11 org.apache.catalina.startup.Catalina start
INFO: Server startup in 4000 ms
2013-09-10 16:23:13 org.apache.catalina.core.StandardWrapperValve invoke
SEVERE: Servlet.service() for servlet [appServlet] in context with path [/portal] threw exception [Request processing failed; nested exception is org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here] with root cause
org.hibernate.HibernateException: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here
at org.springframework.orm.hibernate3.SpringSessionContext.currentSession(SpringSessionContext.java:63)
at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:687)
at com.myportal.portal.model.HibernateDao.getSessionFactory(HibernateDao.java:31)
at com.myportal.portal.model.HibernateDao.testowa(HibernateDao.java:46)
at com.myportal.portal.controllers.HomeController.home(HomeController.java:35)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
我已经阅读了有关此问题的一些信息,但解决方案不适用于我的情况。
我的道课:
package com.myportal.portal.model;
import org.hibernate.classic.Session;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import com.myportal.portal.entity.User;
@Repository
@Transactional(propagation=Propagation.REQUIRED)
public class HibernateDao {
@Autowired
private SessionFactory sessionFactory;
public HibernateDao()
{
}
public HibernateDao(SessionFactory sessionFactory)
{
this.sessionFactory = sessionFactory;
}
private Session getSessionFactory()
{
return sessionFactory.getCurrentSession();
}
private void setSessionFactory(SessionFactory sessionFactory)
{
this.sessionFactory = sessionFactory;
}
public void testowa()
{
User u = new User();
//SessionFactory sf = getSessionFactory();
//Session s = sf.openSession().beginTransaction()
// problem with this
Session session = getSessionFactory();
//session.save(u);
}
}
根上下文.xml
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
<!-- Root Context: defines shared resources visible to all other web components -->
<context:annotation-config/>
<tx:annotation-driven transaction-manager="transactionManager"/>
<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql://localhost/hibernate1"/>
<property name="username" value="root2"/>
<property name="password" value=""/>
<property name="initialSize" value="5"/>
<property name="maxActive" value="10"/>
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="packagesToScan" value="com.spoleczniak.projekt.model"/>
<property name="hibernateProperties">
<props>
<prop key="dialect">org.hibernate.dialect.MySQLInnoDBDialect</prop>
<prop key="show_sql">true</prop>
</props>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory" />
</bean>
<bean class="org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor" />
</beans>
servlet-context.xml
<!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />
<context:annotation-config/>
<context:component-scan base-package="com.myportal.portal" />
<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the ${webappRoot}/resources directory -->
<resources mapping="/resources/**" location="/resources/" />
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<beans:property name="prefix" value="/WEB-INF/views/" />
<beans:property name="suffix" value=".jsp" />
</beans:bean>
我这样使用它:
@Controller
public class RegisterController {
@Autowired
private HibernateDao hibernateDao;
@RequestMapping(value="/register")
public String registerForm()
{
hibernateDao.testowa();
return "register";
}
}
我该如何解决?
我更改 DAO 并创建 UserService,但仍然出现错误:
道:
@Repository
public class HibernateDao {
@Autowired
private SessionFactory sessionFactory;
public HibernateDao()
{
}
public HibernateDao(SessionFactory sessionFactory)
{
this.sessionFactory = sessionFactory;
}
private Session getSessionFactory()
{
return sessionFactory.getCurrentSession();
}
private void setSessionFactory(SessionFactory sessionFactory)
{
this.sessionFactory = sessionFactory;
}
public void testowa()
{
User u = new User();
//SessionFactory sf = getSessionFactory();
//Session s = sf.openSession().beginTransaction()
// problem with this
Session session = getSessionFactory();
//session.save(u);
}
}
用户服务:
@Service
public class UserService {
@Autowired
private HibernateDao hibernateDao;
@Transactional
public void addContact()
{
hibernateDao.testowa();
}
}
控制器:
@Controller
public class RegisterController {
@Autowired
private UserService userService;
@RequestMapping(value="/register")
public String registerForm()
{
userService.addContact();
return "register";
}
}