java - Hibernate 忽略自动提交错误设置。创建本地连接

标签 java hibernate jdbc transactions autocommit

我正在尝试通过 hibernate 将新实体批量保存或更新到 mysql 数据库。我将 transaction.begin 和 transaction.commit 放在一个循环中,该循环执行实体生成并将其传递给 session.saveorUpdate。然而,在每次传递时,hibernate都会连接到数据库,而不是在我调用 transaction.commit() 时最后提交。在检查日志时, hibernate 输出:连接“本地事务”将被提交,连接将设置为自动提交模式

到目前为止,我已经,1)尝试将disabledLocalTxn添加到连接url中,但没有效果, 2)已将自动提交设置为 false 属性但没有最终效果

hibernate 属性:

<property name="hibernate.connection.url">jdbc:mysql://url:port/Dbname?disableLocalTxn=true</property>
  <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property>
  <property name="hibernate.show_sql">false</property>
  <property name="hibernate.hbm2ddl.auto">validate</property>
  <property name="hibernate.current_session_context_class">thread</property>
  <property name="hibernate.jdbc.batch_size">50</property>
  <property name="hibernate.order_inserts">true</property>
  <property name="hibernate.connection.autocommit">false</property>
  <property name="hibernate.hbm2ddl.jdbc_metadata_extraction_strategy">individually</property>
  <mapping class="Object1"/>
  <mapping class="Object2"/>

代码:

tx = session.getTransaction()
tx.begin();

for(i in elements){

session.saveOrUpdate(generateObject1(i));// - Hibernate queries here 

}
tx.commit;// - instead of all at end

下面的日志输出,最后一行表示连接将设置为自动提交

Jun 11, 2019 9:26:06 PM org.hibernate.engine.jdbc.connections.internal.DriverManagerConnectionProviderImpl buildCreator
INFO: HHH10001003: Autocommit mode: false
Jun 11, 2019 9:26:06 PM org.hibernate.engine.jdbc.connections.internal.PooledConnections <init>
INFO: HHH000115: Hibernate connection pool size: 20 (min=1)
Jun 11, 2019 9:26:12 PM org.hibernate.dialect.Dialect <init>
INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect
Jun 11, 2019 9:26:13 PM org.hibernate.engine.jdbc.env.internal.LobCreatorBuilderImpl useContextualLobCreation
INFO: HHH000423: Disabling contextual LOB creation as JDBC driver reported JDBC version [3] less than 4
Jun 11, 2019 9:26:27 PM org.hibernate.resource.transaction.backend.jdbc.internal.DdlTransactionIsolatorNonJtaImpl getIsolatedConnection
INFO: HHH10001501: Connection obtained from JdbcConnectionAccess [org.hibernate.engine.jdbc.env.internal.JdbcEnvironmentInitiator$ConnectionProviderJdbcConnectionAccess@2257fadf] for (non-JTA) DDL execution was not in auto-commit mode; the Connection 'local transaction' will be committed and the Connection will be set into auto-commit mode.

最佳答案

结束这一切,以防有人以某种方式到达这里。

当 ddl 语句设置为更新时,需要自动提交。所以只有 ddl 语句在自动提交真实模式下运行

但是,当您通过 session.beginTransaction 和 tx.commit 进行手动事务处理时,它会像在自动提交错误模式下一样运行。

所以一切都很好。当它为 hibernate 的 saveOrUpdate() 选择数据库时,由于额外的查询而出现一些困惑

关于java - Hibernate 忽略自动提交错误设置。创建本地连接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56547980/

相关文章:

java - JVM 的任何编译器都使用 "wide"goto 吗?

java - CriteriaBuilder 和实体列表的 isMember (Hibernate)

mysql - 选择记录,其中 id 是集合 id 之一

java - 无法使用包 org.apache.commons.lang.StringUtils

java - 如何在 java 中创建自定义注释?

mysql - 反向子句 IN 命名查询 Hibernate

java - 带 session 的异步服务

postgresql - 如何通过 Spark 中的 jdbc 连接到 docker 托管的 postgresql 数据库?

java - 如何使用 spring jdbc 存储过程将用户定义的数据类型变量的值从 java 传递到 MS SQL

java - 如何从 Guava 范围类获取正确的字符串