整合Hibernate出现的错误

Dongz 发布于 2013/04/22 08:43
阅读 831
收藏 1

 

我的spring-hibernate.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:aop="http://www.springframework.org/schema/aop"
    xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
">

    <!--
配置数据源 -->
    <bean name="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
        init-method="init" destroy-method="close">
        <property name="url" value="${jdbc_url}" />
        <property name="username" value="${jdbc_username}" />
        <property name="password" value="${jdbc_password}" />

        <!--
初始化连接大小 -->
        <property name="initialSize" value="0" />
        <!--
连接池最大使用连接数量 -->
        <property name="maxActive" value="20" />
        <!--
连接池最大空闲 -->
        <property name="maxIdle" value="20" />
        <!--
连接池最小空闲 -->
        <property name="minIdle" value="0" />
        <!--
获取连接最大等待时间 -->
        <property name="maxWait" value="60000" />

        <property name="validationQuery" value="${validationQuery}" />
        <property name="testOnBorrow" value="false" />
        <property name="testOnReturn" value="false" />
        <property name="testWhileIdle" value="true" />

        <!--
配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒 -->
        <property name="timeBetweenEvictionRunsMillis" value="60000" />
        <!--
配置一个连接在池中最小生存的时间,单位是毫秒 -->
        <property name="minEvictableIdleTimeMillis" value="25200000" />

        <!--
打开removeAbandoned功能 -->
        <property name="removeAbandoned" value="true" />
        <!-- 1800
秒,也就是30分钟 -->
        <property name="removeAbandonedTimeout" value="1800" />
        <!--
关闭abanded连接时输出错误日志 -->
        <property name="logAbandoned" value="true" />

        <!--
监控数据库 -->
        <!-- <property name="filters" value="stat" /> -->
        <property name="filters" value="mergeStat" />
    </bean>

    <!--
配置hibernate session工厂 -->
    <bean id="sessionFactory"
        class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
        <property name="dataSource" ref="dataSource" />
        <property name="hibernateProperties">
            <props>
                <prop key="hibernate.hbm2ddl.auto">${hibernate.hbm2ddl.auto}</prop>
                <prop key="hibernate.dialect">${hibernate.dialect}</prop>
                <prop key="hibernate.show_sql">${hibernate.show_sql}</prop>
                <prop key="hibernate.format_sql">${hibernate.format_sql}</prop>
            </props>
        </property>
        <!--
自动扫描hbm方式配置的hibernate文件和.hbm文件 -->
        <property name="mappingDirectoryLocations">
            <list>
                <value>classpath:zdd/security/model</value>
            </list>
        </property>

        
    </bean>

    <!--
配置事务管理器 -->
    <bean name="transactionManager"
        class="org.springframework.orm.hibernate4.HibernateTransactionManager">
        <property name="sessionFactory" ref="sessionFactory"></property>
    </bean>

    <!--
拦截器方式配置事物 -->
    <tx:advice id="transactionAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="add*" />
            <tx:method name="save*" />
            <tx:method name="update*" />
            <tx:method name="modify*" />
            <tx:method name="edit*" />
            <tx:method name="delete*" />
            <tx:method name="remove*" />
            <tx:method name="repair" />
            <tx:method name="deleteAndRepair" />

            <tx:method name="get*" propagation="SUPPORTS" />
            <tx:method name="find*" propagation="SUPPORTS" />
            <tx:method name="load*" propagation="SUPPORTS" />
            <tx:method name="search*" propagation="SUPPORTS" />
            <tx:method name="datagrid*" propagation="SUPPORTS" />

            <tx:method name="*" propagation="SUPPORTS" />
        </tx:attributes>
    </tx:advice>
    <aop:config>
        <aop:pointcut id="transactionPointcut"
            expression="execution(* zdd.security.service..*Impl.*(..))" />
        <aop:advisor pointcut-ref="transactionPointcut"
            advice-ref="transactionAdvice" />
    </aop:config>

</beans>

 

spring.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:context="http://www.springframework.org/schema/context" xsi:schemaLocation="
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
">

    <!--
引入属性文件 -->
    <context:property-placeholder location="classpath:config.properties" />

    <!-- =============action
层配置=============== -->
      <bean id="userServiceI" class="zdd.security.action.UserAction">
        <property name="tsi"><ref bean="testSpring" /></property>
        <property name="usi"><ref bean="userService" /></property>
    </bean>  
    
    
    <!-- ===================dao
======================= -->
    <bean id="userDao" class="zdd.security.dao.impl.UserDaoImpl">
        <property name="sessionFaction">
            <ref bean="sessionFactory" />
        </property>
    </bean>
    
    <!--  =============service
层配置================  -->
    <!--
测试Spring  -->
     <bean id="testSpring"  class="zdd.security.service.impl.TestSpringImpl"></bean>
    
    <bean id="userService"  class="zdd.security.service.impl.UserServiceImpl">
        <property name="userDao"><ref bean="userDao" /></property>
    </bean>
    
</beans>

 

测试类如下:

package zdd.security.test;

import org.junit.Test;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

import zdd.security.model.Tuser;
import zdd.security.service.UserServiceI;

public class TestHibernate {

    @Test
    public void test() {
        ApplicationContext ac = new ClassPathXmlApplicationContext(
                new String[] { "classpath:spring.xml",
                        "classpath:spring-hibernate.xml" });
        UserServiceI usi = (UserServiceI) ac.getBean("userService");// ?
        //
        Tuser user = new Tuser();
        user.setId(102);
        user.setUsername("zhang");
        user.setPwd("123456");

        usi.sava(user);

    }

}

dao
采用 this.sessionFaction.getCurrentSession().save(user); 保存用户信息。结果报如下这样的错误,求大神解决,谢谢

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:941)

         at zdd.security.dao.impl.UserDaoImpl.sava(UserDaoImpl.java:27)

         at zdd.security.service.impl.UserServiceImpl.sava(UserServiceImpl.java:25)

         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

         at java.lang.reflect.Method.invoke(Method.java:597)

         at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:319)

         at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:183)

         at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:150)

         at com.alibaba.druid.support.spring.stat.DruidStatInterceptor.invoke(DruidStatInterceptor.java:73)

         at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)

         at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:110)

         at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)

         at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:90)

         at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:172)

         at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:202)

         at $Proxy7.sava(Unknown Source)

         at zdd.security.test.TestHibernate.test(TestHibernate.java:24)

         at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

         at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

         at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

         at java.lang.reflect.Method.invoke(Method.java:597)

         at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:45)

         at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15)

         at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:42)

         at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20)

         at org.junit.runners.ParentRunner.runLeaf(ParentRunner.java:263)

         at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:68)

         at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:47)

         at org.junit.runners.ParentRunner$3.run(ParentRunner.java:231)

         at org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:60)

         at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:229)

         at org.junit.runners.ParentRunner.access$000(ParentRunner.java:50)

         at org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:222)

         at org.junit.runners.ParentRunner.run(ParentRunner.java:300)

         at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:50)

         at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)

         at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467)

         at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683)

         at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390)

         at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197)

 求解决方案,谢谢。

加载中
0
不是小白
不是小白
发现了,你仔细看看你的 service里面写的方法名是什么 :sava  啊,大哥。。。。
不是小白
不是小白
回复 @Dongz : 没事儿, 互帮互助才能提高技术。
Dongz
Dongz
非常感谢,耽误您时间了。谢谢
0
不是小白
不是小白

this.sessionFaction.getCurrentSession().save(user);

改成:

this.sessionFaction.openSession().save(user);

0
今夜吴眠
试试一楼说的
0
小猫王
小猫王

this.sessionFaction.getCurrentSession().save(user); 怎么会获取不到session?

要是没有session,应回创建一个session吧;如果有就直接在本地线程取session;

0
Dongz
Dongz

谢谢您的回复。

改写成this.sessionFaction.openSession().save(user);

执行不会出错但它不会向数据库插入数据

Dongz
Dongz
回复 @不是白云 : 配置 <tx:method name="save*" propagation="SUPPORTS" />也是报这样的错误org.hibernate.HibernateException: No Session found for current thread
不是小白
不是小白
配置一下: <tx:method name="save*" propagation="SUPPORTS" />
0
Dongz
Dongz
配置 <tx:method name="save*" propagation="SUPPORTS" />也是报这样的错误org.hibernate.HibernateException: No Session found for current thread
不是小白
不是小白
这一句是解决你数据插不进数据库的。。。不是解决异常的,解决异常的是这一句:this.sessionFaction.openSession().save(user);
0
不是小白
不是小白

还有你这一句配错了,仔细看下:

expression="execution(* zdd.security.service..*Impl.*(..))" />

0
不是小白
不是小白

这样就ok了。。。


expression="execution(public * zdd.security.service.*.*(..))"



0
Dongz
Dongz

谢谢你的回答,expression="execution(public * zdd.security.service.*.*(..))"这样的写法还是不行,用this.sessionFaction.openSession().save(user);这个spring不会为你自动开始session和关闭session的,这个写法就不会向数据库插入数据。

sessionFaction.getCurrentSession().save(user);spring会自动帮你管理session。但就是报org.hibernate.HibernateException: No Session found for current thread错误,求解

0
不是小白
不是小白

引用来自“Dongz”的答案

谢谢你的回答,expression="execution(public * zdd.security.service.*.*(..))"这样的写法还是不行,用this.sessionFaction.openSession().save(user);这个spring不会为你自动开始session和关闭session的,这个写法就不会向数据库插入数据。

sessionFaction.getCurrentSession().save(user);spring会自动帮你管理session。但就是报org.hibernate.HibernateException: No Session found for current thread错误,求解

 只要你用spring管理,他就会帮你管理。

你要非要用:sessionFaction.getCurrentSession().save(user);也行,

不过要配置一下:

<tx:method name="save*" propagation="REQUIRED" />

不是小白
不是小白
回复 @Dongz : 你的方法名写错了,你这样配置吧: <tx:method name="sava*" propagation="REQUIRED" />
Dongz
Dongz
回复 @不是白云 : 估计还是哪少配置了什么东西。
不是小白
不是小白
回复 @Dongz : 。。。怎么可能。。。
Dongz
Dongz
这个配置还是有问题的,试了还是报没有回话发现当前线程的错误
不是小白
不是小白
两边没有<strong></strong>,莫名其妙,osc自动添上的。。。
返回顶部
顶部