Spring JPA - 没有事务设置自动提交 'true'
Spring JPA - No transaction set autocommit 'true'
有什么方法可以在没有事务的情况下使用 JPA 自动提交吗?
persistence.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>
数据-config.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();
}
但是在会话终止之前我无法看到提交。我要逐条提交。
不,JPA 中没有自动提交,它也没有多大意义,因为对实体的每次更改都是最终进入数据库的更改。使用自动提交,对 属性 的每个更改都将是一个事务。这是一个非常特殊的要求,不符合 JPA 的候选功能。
但是您需要做的就是围绕 entityManager.merge(user);
进行交易
您可以尝试在 persistence.xml
中使用 <property name="hibernate.connection.autocommit" value="true" />
供您参考,请参考Whosebug的this link关于自动提交的讨论属性。
不,有一种方法可以禁用事务并使用自动提交。如果您使用 spring 启动应用程序,只需在 application.properties 文件中设置 属性。
spring:
jpa:
properties:
hibernate:
allow_update_outside_transaction: true
有什么方法可以在没有事务的情况下使用 JPA 自动提交吗?
persistence.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>
数据-config.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();
}
但是在会话终止之前我无法看到提交。我要逐条提交。
不,JPA 中没有自动提交,它也没有多大意义,因为对实体的每次更改都是最终进入数据库的更改。使用自动提交,对 属性 的每个更改都将是一个事务。这是一个非常特殊的要求,不符合 JPA 的候选功能。
但是您需要做的就是围绕 entityManager.merge(user);
您可以尝试在 persistence.xml
中使用<property name="hibernate.connection.autocommit" value="true" />
供您参考,请参考Whosebug的this link关于自动提交的讨论属性。
不,有一种方法可以禁用事务并使用自动提交。如果您使用 spring 启动应用程序,只需在 application.properties 文件中设置 属性。
spring:
jpa:
properties:
hibernate:
allow_update_outside_transaction: true