如何在Hibernate中批量更新

dl5txlt9  于 2023-10-23  发布在  其他
关注(0)|答案(1)|浏览(144)

我需要使用Hibernate更新MySQL数据库中的多行。我已经使用JDBC完成了这一点,我们支持批量查询。我想在hibernate里有这样的东西。
Hibernate支持批量查询吗?
jdbc中的批处理查询示例:

// Create statement object
Statement stmt = conn.createStatement();

String SQL = "INSERT INTO Employees (id, first, last, age) " +
    "VALUES(200,'Zia', 'Ali', 30)";

// Add above SQL statement in the batch.
stmt.addBatch(SQL);

// Create one more SQL statement
String SQL = "INSERT INTO Employees (id, first, last, age) " +
    "VALUES(201,'Raj', 'Kumar', 35)";

// Add above SQL statement in the batch.
stmt.addBatch(SQL);

int[] count = stmt.executeBatch();

现在,当我们发出stmt.executeBatch调用时,两个SQL查询将在一个jdbc往返中执行。

6pp0gazn

6pp0gazn1#

您可以查看Hibernate文档。Hibernate有一些配置属性来控制(或禁用)JDBC的使用。

  • 如果您多次发出相同的INSERT,并且您的实体没有使用标识生成器,那么Hibernate将透明地使用JDBC对象。
  • 该配置必须启用JDBC的使用。默认情况下禁用批处理。
    配置Hibernate

hibernate.jdbc.batch_size属性定义了Hibernate在请求驱动程序执行批处理之前将批处理的语句数量。零或负数将禁用该按钮。
您可以定义一个全局配置,例如:在persistence.xml中,或者定义特定于会话的配置。要配置会话,可以使用如下代码

entityManager
    .unwrap( Session.class )
    .setJdbcBatchSize( 10 );

使用JDBC接口

如前所述,Hibernate透明地调用JDBC对象。如果你想控制这个进程,你可以在会话中使用flush()clear()方法。
以下是文档中的一个示例。当插入次数达到batchSize值时,它调用flush()clear()。如果batchSize小于或等于配置的hibernate.jdbc.batch_size,则它可以有效工作。

EntityManager entityManager = null;
EntityTransaction txn = null;
try {
    entityManager = entityManagerFactory().createEntityManager();

    txn = entityManager.getTransaction();
    txn.begin();

    // define a batch size lesser or equal than the JDBC batching size    
    int batchSize = 25;

    for ( int i = 0; i < entityCount; ++i ) {
        Person Person = new Person( String.format( "Person %d", i ) );
        entityManager.persist( Person );

        if ( i > 0 && i % batchSize == 0 ) {
            //flush a batch of inserts and release memory
            entityManager.flush();
            entityManager.clear();
        }
    }

    txn.commit();
} catch (RuntimeException e) {
    if ( txn != null && txn.isActive()) txn.rollback();
        throw e;
} finally {
    if (entityManager != null) {
        entityManager.close();
    }
}

相关问题