0

我将hibernate 4与spring 3一起使用,并在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:context="http://www.springframework.org/schema/context"
    xmlns:jee="http://www.springframework.org/schema/jee" 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/context http://www.springframework.org/schema/context/spring-context-3.0.xsd
        http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-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 id="propertiesConfigurer"
        class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
        <property name="locations">
            <list>
                <value>/WEB-INF/conf/jdbc.properties</value>
            </list>
        </property>
</bean>



    <tx:annotation-driven transaction-manager="transactionManager"/>
    <context:annotation-config />
    <context:component-scan base-package="com.friendsalert"/>
    <aop:aspectj-autoproxy/>

    <!--    
<bean id="log4jInitialization"
    class="org.springframework.beans.factory.config.MethodInvokingFactoryBean"    >
    <property name="targetClass"
        value="org.springframework.util.Log4jConfigurer" />
    <property name="targetMethod" value="initLogging" />
    <property name="arguments">
        <list>
            <value>/WEB-INF/conf/log4j.xml</value>
             this value is bad for production.
            <value>10000</value>

        </list>
    </property>
</bean>    
 -->
<!-- ========================= RESOURCE DEFINITIONS ========================= -->

<!-- Local Apache Commons DBCP DataSource that refers to a combined database -->
<!-- (see dataAccessContext-jta.xml for an alternative) -->
<!-- The placeholders are resolved from jdbc.properties through -->
<!-- the PropertyPlaceholderConfigurer in applicationContext.xml-->

<bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
    <property name="driverClassName" value="${jdbc.driverClassName}"/>
    <property name="url" value="${jdbc.url}"/>
    <property name="username" value="${jdbc.username}"/>
    <property name="password" value="${jdbc.password}"/>
    <property name="initialSize" value="${jdbc.initialSize}"/>
    <property name="validationQuery" value="${jdbc.validationQuery}"/>
    <property name="maxWait" value="${jdbc.maxWait}"/>
    <property name="testOnBorrow" value="${jdbc.testOnBorrow}"/>
    <property name="testWhileIdle" value="${jdbc.testWhileIdle}"/>
    <!-- property name="loginTimeout" value="${jdbc.loginTimeout}"/ -->

</bean>

<!-- Transaction manager for a single JDBC DataSource -->
<!-- (see dataAccessContext-jta.xml for an alternative) 
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    <property name="dataSource" ref="dataSource"/>
</bean>
-->
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="localSessionFactory"/>
</bean>


<bean id="localSessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" depends-on="dataSource">
    <property name="dataSource" ref="dataSource"/>
    <property name="mappingResources">
        <list>
            <value>com/friendsalert/model/User.hbm.xml</value>

        </list>
    </property>
    <property name="hibernateProperties">
        <props>
            <!-- prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop -->
            <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</prop>
            <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop> 
            <prop key="hibernate.cache.use_second_level_cache">true</prop>
            <prop key="hibernate.cache.provider_class">org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory</prop>
            <prop key="hibernate.cache.use_query_cache">true</prop> 

                <!--  cache factory for hibernate 3.3 (surrently we use 3.2)-->
            <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>                              
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.connection.useUnicode">true</prop>
            <prop key="hibernate.connection.charSet">UTF8</prop>
            <!--  <prop key="hibernate.current_session_context_class">thread</prop>-->
            <prop key="hibernate.connection.aggressive_release">false</prop>                    
            <prop key="hibernate.connection.release_mode">after_transaction</prop>  
            <prop key="hibernate.connection.autocommit">true</prop>
            <!--  create / drop.. use exporter class instead!-->
            <prop key="hibernate.hbm2ddl.auto">update</prop> 
        </props>
    </property>
</bean>

<bean id="userDao" class="com.friendsalert.dao.UserDao">
<property name="sessionFactory" ref="localSessionFactory"/>     
 </bean>



</beans>

我用道。当我进行事务(保存、获取、更新)时,它第一次工作,第二次我收到一个错误,表明事务已关闭。我在我的 dao 中为每个函数使用 @Transactional 注释,所以我无法找出为什么没有事务。

谁能告诉我我做错了什么?

谢谢

4

1 回答 1

1

关于您的配置的不寻常之处是:

<prop key="hibernate.connection.aggressive_release">false</prop>                    
<prop key="hibernate.connection.release_mode">after_transaction</prop>  
<prop key="hibernate.connection.autocommit">true</prop>

我会尝试不使用这些线条。

从参考文档:不推荐使用自动提交模式
hibernate.connection.autocommit
为 JDBC 池连接启用自动提交(不推荐)。例如真| false hibernate.connection.release_mode 指定 Hibernate 何时应该释放 JDBC 连接。默认情况下,JDBC 连接会一直保持到会话显式关闭或断开连接为止。对于应用程序服务器 JTA 数据源,使用 after_statement 在每次 JDBC 调用后主动释放连接。对于非 JTA 连接,使用 after_transaction 在每个事务结束时释放连接通常是有意义的。auto 将为 JTA 和 CMT 事务策略选择 after_statement,为 JDBC 事务选择 after_transaction

于 2012-07-23T16:46:01.747 回答