【问题标题】:Spring JPA - No transaction set autocommit 'true'Spring JPA - 没有事务集自动提交'true'
【发布时间】:2015-09-22 15:26:48
【问题描述】:

有没有什么方法可以在没有事务的情况下使用 JPA 自动提交?

持久性.xml

<persistence-unit name="mytest" transaction-type="RESOURCE_LOCAL">
    <properties>
        <property name="hibernate.show_sql" value="true" />
        <property name="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
    </properties>
</persistence-unit>

数据配置.xml

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
        <property name="persistenceUnitName" value="mytest" />
        <property name="dataSource" ref="myDataSource" />
        <property name="jpaVendorAdapter">
            <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter">
                <property name="showSql" value="true" />
                <property name="database" value="ORACLE" />
            </bean>
        </property>
        <property name="jpaPropertyMap">
            <map>
<entry key="hibernate.format_sql" value="false" />
                <entry key="hibernate.dialect" value="org.hibernate.dialect.Oracle10gDialect" />
                <entry key="hibernate.jdbc.fetch_size" value="0" />
                <entry key="hibernate.jdbc.batch_size" value="0" />
                <entry key="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy" />
            </map>
        </property>
    </bean>
    <tx:annotation-driven transaction-manager="transactionManager"/>
    <bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager">
        <property name="entityManagerFactory" ref="entityManagerFactory" />
        <qualifier value="mytest"/>
    </bean>

代码

for(User user: users) {
    entityManager.merge(user);
    entityManager.flush();
}

但是在会话终止之前我无法看到提交。我想逐条提交。

【问题讨论】:

    标签: hibernate jpa openjpa jpa-2.1


    【解决方案1】:

    不,有一种方法可以禁用事务并使用自动提交。如果您使用的是 Spring Boot 应用程序,只需在 application.properties 文件中设置属性即可。

    spring:
      jpa:
        properties:
          hibernate:
            allow_update_outside_transaction: true
    

    【讨论】:

      【解决方案2】:

      您可以尝试在 persistence.xml 中使用&lt;property name="hibernate.connection.autocommit" value="true" /&gt;

      供您参考,请参考 stackoverflow 的 this link 讨论自动提交属性。

      【讨论】:

        【解决方案3】:

        不,JPA 中没有自动提交,这也没有多大意义,因为对实体的每次更改都是最终进入数据库的更改。使用自动提交,对属性的每一次更改都将是一个事务。这是一个非常特殊的要求,不符合 JPA 的候选功能。

        但您需要做的就是围绕entityManager.merge(user); 包装一个事务

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-02-11
          • 2015-12-17
          • 2014-04-16
          • 1970-01-01
          • 2016-10-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多