簡體   English   中英

Spring:沒有Hibernate Session綁定到線程,並且配置不允許在此處創建非事務性會話

[英]Spring: No Hibernate Session bound to thread, and configuration does not allow creation of non-transactional one here

我正在創建一個簡單的Web應用程序,以顯示行並將其添加到oracle數據庫(Regions表)中。 可悲的是我在標題中遇到了異常。 不幸的是,我已經看到與此類似的問題,但沒有任何幫助。

我做錯了什么? 我知道這與交易有關。 我已經將Service標注為@Transactional ,但是它並不能解決我的問題。

是否有人可以檢查Service imports是否正確。

如果需要更多內容,請發表評論。

例外

WARNING:   StandardWrapperValve[dispatcher]: Servlet.service() for servlet dispatcher threw exception
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:64)
    at org.hibernate.impl.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:687)
    at facade.RegionsDaoImpl.getRegions(RegionsDaoImpl.java:31)
    at facade.RegionServiceImpl.getRegions(RegionServiceImpl.java:27)
    at controllers.RegionsController.listCustomers(RegionsController.java:31)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:606)
    at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:219)
    at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
    at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:745)
    at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:686)
    at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
    at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:925)
    at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:856)
    at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:936)
    at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:827)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
    at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:812)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
    at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
    at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
    at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:357)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:260)
    at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:188)
    at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:191)
    at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:168)
    at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:189)
    at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:288)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:206)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:136)
    at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:114)
    at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
    at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:838)
    at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:113)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:115)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:55)
    at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:135)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:564)
    at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:544)
    at java.lang.Thread.run(Thread.java:745)

applicationContext.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:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd
       http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.1.xsd
       http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd">


    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <property name="driverClassName">
            <value>oracle.jdbc.driver.OracleDriver</value>
        </property>
        <property name="url">
            <value>jdbc:oracle:thin:@localhost:1521:XE</value>
        </property>
        <property name="username">
            <value>hr</value>
        </property>
        <property name="password">
            <value>hr</value>
        </property>
    </bean>


    <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="dataSource">
            <ref bean="dataSource"/>
        </property>
        <property name="mappingResources">
            <list> 
                <value>persistence/Regions.hbm.xml</value> 
                <value>persistence/Countries.hbm.xml</value>
                <value>persistence/Locations.hbm.xml</value>
                <value>persistence/Departments.hbm.xml</value>
                <value>persistence/Employees.hbm.xml</value>
                <value>persistence/JobHistory.hbm.xml</value>
                <value>persistence/Jobs.hbm.xml</value>
            </list>
        </property>
        <!--<property name="configLocation">
        <value>/WEB-INF/hibernate.cfg.xml</value>
        </property> -->
        <property name="hibernateProperties">
            <props> 
                <prop key="hibernate.dialect">org.hibernate.dialect.OracleDialect</prop> 
            </props>
        </property>
    </bean>

    <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
        <property name="sessionFactory">
            <ref bean="sessionFactory"/>
        </property>
    </bean>



    <tx:annotation-driven/>
</beans>

dispatcher-servlet.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xmlns:beans="http://www.springframework.org/schema/beans"
             xmlns:context="http://www.springframework.org/schema/context"
             xmlns:tx="http://www.springframework.org/schema/tx"
             xsi:schemaLocation="http://www.springframework.org/schema/mvc 
            http://www.springframework.org/schema/mvc/spring-mvc.xsd
            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">
    <!-- DispatcherServlet Context: defines this servlet's request-processing infrastructure -->
    <!-- Enables the Spring MVC annotation mechanism-->
    <annotation-driven />
    <context:annotation-config/> 
    <context:component-scan base-package="controllers" />
    <!-- Resolves views choosen for rendering to .jsp resources in the /WEB-INF/jsp directory -->
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/jsp/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>

    <beans:bean id="regionsDao" class="facade.RegionsDaoImpl"/>

    <beans:bean id="regionService" class="facade.RegionServiceImpl"/> 
</beans:beans>

RegionsController.java

package controllers;

import facade.RegionService;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import persistence.Regions;

@Controller
public class RegionsController {
    @Autowired
    private RegionService regionsService;

    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String welcome(Model model) {
        return "index";
    }

    @RequestMapping(value = "/regions")
    public String listCustomers(Model model) {

        List<Regions> regionsList = regionsService.getRegions();
        model.addAttribute("regionsList", regionsList);
        model.addAttribute("region", new Regions());
        return "regions";
    }

    @RequestMapping(value = "/add_region")
    public String addRegion(@ModelAttribute Regions r) {
        regionsService.addRegion(r);
        return "redirect:/customers";
    }
}

RegionService.java RegionServiceImpl.java

package facade;

import java.util.List;
import persistence.Regions;

public interface RegionService {
    public List<Regions> getRegions();
    public void addRegion(Regions r);
}

/*******************************************/
package facade;

import java.util.List;
import javax.transaction.Transactional;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import persistence.Regions;


@Service
@Transactional
public class RegionServiceImpl implements RegionService{

    @Autowired
    private RegionsDao regionsDao;

    @Override
    public List<Regions> getRegions() {
        return regionsDao.getRegions();
    }

    @Override
    public void addRegion(Regions r) {
        regionsDao.addRegion(r);
    }

}

RegionsDao.java RegionsDaoImpl.java

package facade;

import java.math.BigDecimal;
import java.util.List;
import persistence.Regions;

public interface RegionsDao {
    public void addRegion(Regions r);
    public List<Regions> getRegions();
    public void removeRegion(BigDecimal regionId);
}

/**********************************************/
package facade;

import java.math.BigDecimal;
import java.util.List;
import org.hibernate.SessionFactory;
import org.springframework.beans.factory.annotation.Autowired;
import persistence.Regions;

public class RegionsDaoImpl implements RegionsDao {
    @Autowired
    private SessionFactory sessionFactory;

    @Override
    public void addRegion(Regions r) {
        sessionFactory.getCurrentSession().save(r);
    }

    @Override
    public List<Regions> getRegions() {
        return sessionFactory.getCurrentSession().createQuery("from Regions r").list();
    }

    @Override
    public void removeRegion(BigDecimal regionId) {
        throw new UnsupportedOperationException("Not supported yet.");
    }
}

將此代碼從dispatcher-servlet.xml移出

<beans:bean id="regionsDao" class="facade.RegionsDaoImpl"/>

<beans:bean id="regionService" class="facade.RegionServiceImpl"/>

applicationContext.xml

<bean id="regionsDao" class="facade.RegionsDaoImpl"/>

您不需要<bean/>的RegionServiceImpl,因為您在服務impl類上具有@Service applicationContext.xml添加

<context:component-scan base-package="facade" />

在您的RegionServiceImpl類中,導入實際上應該是:

import org.springframework.transaction.annotation.Transactional;

我的猜測是您的@Transactional服務沒有由Spring AOP系統正確地檢測。 可以通過在事務方法中放置一個斷點並檢查調用堆棧來驗證這一點。 Spring使用CGLIB生成代理類,因此,如果一切正常,您應該會看到一些異常的類名稱(請查找“ $ EnhancerByCGLIB”)

在服務對象中,您導入了錯誤的事務注釋。 您正在使用的是Java native(EJB),春季是:org.springframework.transaction.annotation.Transactional

因此,只需更改此行

導入javax.transaction.transactional

導入org.springframework.transaction.annotation.Transactional

在RegionServiceImpl中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM