0

私はSpring 3でhibernate 4を使用し、次のように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を使います。トランザクション (保存、取得、更新) を実行すると、最初は機能し、2 回目はトランザクションが閉じられているというエラーが表示されます。私はすべての関数の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 プール接続の自動コミットを有効にします (推奨されません)。例: true | 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 に答える