在Hibernate中插入多行-批插入

在Hibernate中插入多行-批插入,hibernate,batch-file,batch-processing,Hibernate,Batch File,Batch Processing,我正在Hibernate中插入多行,在我的DAO类中使用以下事务性代码单元 @Override @SuppressWarnings("unchecked") @Transactional(readOnly = false, propagation=Propagation.REQUIRES_NEW, rollbackFor={Throwable.class}) public String insertZoneCharge(Long zoneId, List<Object[]> item

我正在Hibernate中插入多行,在我的DAO类中使用以下事务性代码单元

@Override
@SuppressWarnings("unchecked")
@Transactional(readOnly = false, propagation=Propagation.REQUIRES_NEW, rollbackFor={Throwable.class})
public String insertZoneCharge(Long zoneId, List<Object[]> items)
{
    Session session=sessionFactory.openSession();
    session.beginTransaction();

    //Configuration configuration=new Configuration();
    //configuration.setProperty("hibernate.jdbc.batch_size", "50");
    int i=1;

    for(Object[] o:items)
    {
        if(o[2]!=null&&StringUtils.isNotBlank(o[2].toString()))
        {
            ZoneChargePK zoneChargeId=new ZoneChargePK();
            zoneChargeId.setWeightId(Long.parseLong(o[0].toString()));
            zoneChargeId.setZoneId(zoneId);

            model.ZoneCharge zoneCharge=new model.ZoneCharge();
            zoneCharge.setZoneChargePK(zoneChargeId);
            zoneCharge.setCharge(new BigDecimal(o[2].toString()).setScale(2, RoundingMode.HALF_UP));
            session.save(zoneCharge);

            if(++i%50==0)
            {
                session.flush();
                session.clear();
            }
        }
    }

    session.getTransaction().commit();
    session.close();
    return "Data saved successfully.";
}
调试和跟踪信息如下

DEBUG [http-apr-8080-exec-84] (SqlStatementLogger.java:104) - insert into WAGAFASHIONDB.ZONE_CHARGE (CHARGE, WEIGHT_ID, ZONE_ID) values (?, ?, ?)
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [1] as [NUMERIC] - 1.00
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [2] as [BIGINT] - 164
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [3] as [BIGINT] - 22

DEBUG [http-apr-8080-exec-84] (SqlStatementLogger.java:104) - insert into WAGAFASHIONDB.ZONE_CHARGE (CHARGE, WEIGHT_ID, ZONE_ID) values (?, ?, ?)
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [1] as [NUMERIC] - 2.00
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [2] as [BIGINT] - 221
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [3] as [BIGINT] - 22

DEBUG [http-apr-8080-exec-84] (SqlStatementLogger.java:104) - insert into WAGAFASHIONDB.ZONE_CHARGE (CHARGE, WEIGHT_ID, ZONE_ID) values (?, ?, ?)
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [1] as [NUMERIC] - 3.00
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [2] as [BIGINT] - 163
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [3] as [BIGINT] - 22
<property name="hibernateProperties">
    <value>
        hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
        hibernate.jdbc.batch_size=50
        hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider            
        hibernate.format_sql=false
        hibernate.show_sql=true
        hibernate.order_updates=true
        hibernate.connection.autocommit=false
        hibernate.order_inserts=true
        hibernate.order_updates=true
        hibernate.cache.use_query_cache=false
        hibernate.cache.use_second_level_cache=false
        javax.persistence.validation.mode=callback            
    </value>        
  </property>           
因此,似乎已经执行了三个独立的
INSERT
语句,并且对数据库进行了三次单独的访问

我希望它在一次行程中只执行一个多行
INSERT
语句。在这种情况下,Hibernate真的会执行三条独立的语句吗?如果是,那么在特定批处理中执行语句的方式是什么?我的代码有什么错误吗


我在
application context.xml
中的Hibernate配置如下

DEBUG [http-apr-8080-exec-84] (SqlStatementLogger.java:104) - insert into WAGAFASHIONDB.ZONE_CHARGE (CHARGE, WEIGHT_ID, ZONE_ID) values (?, ?, ?)
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [1] as [NUMERIC] - 1.00
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [2] as [BIGINT] - 164
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [3] as [BIGINT] - 22

DEBUG [http-apr-8080-exec-84] (SqlStatementLogger.java:104) - insert into WAGAFASHIONDB.ZONE_CHARGE (CHARGE, WEIGHT_ID, ZONE_ID) values (?, ?, ?)
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [1] as [NUMERIC] - 2.00
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [2] as [BIGINT] - 221
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [3] as [BIGINT] - 22

DEBUG [http-apr-8080-exec-84] (SqlStatementLogger.java:104) - insert into WAGAFASHIONDB.ZONE_CHARGE (CHARGE, WEIGHT_ID, ZONE_ID) values (?, ?, ?)
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [1] as [NUMERIC] - 3.00
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [2] as [BIGINT] - 163
TRACE [http-apr-8080-exec-84] (BasicBinder.java:83) - binding parameter [3] as [BIGINT] - 22
<property name="hibernateProperties">
    <value>
        hibernate.dialect=org.hibernate.dialect.Oracle10gDialect
        hibernate.jdbc.batch_size=50
        hibernate.cache.provider_class=org.hibernate.cache.EhCacheProvider            
        hibernate.format_sql=false
        hibernate.show_sql=true
        hibernate.order_updates=true
        hibernate.connection.autocommit=false
        hibernate.order_inserts=true
        hibernate.order_updates=true
        hibernate.cache.use_query_cache=false
        hibernate.cache.use_second_level_cache=false
        javax.persistence.validation.mode=callback            
    </value>        
  </property>           

hibernate.dialogue=org.hibernate.dialogue.Oracle10gDialogue
hibernate.jdbc.batch_size=50
hibernate.cache.provider\u class=org.hibernate.cache.EhCacheProvider
hibernate.format_sql=false
hibernate.show_sql=true
hibernate.order\u updates=true
hibernate.connection.autocommit=false
hibernate.order_inserts=true
hibernate.order\u updates=true
hibernate.cache.use\u query\u cache=false
hibernate.cache.use_second_level_cache=false
javax.persistence.validation.mode=回调

您的期望是错误的。Hibernate不会生成单个insert语句。但它将向一个批处理中添加三条insert语句并执行该批处理,从而对数据库进行一次往返


有关JDBC批量更新的更多信息,请阅读。

Configuration-Configuration=new-Configuration();setProperty(“hibernate.jdbc.batch_size”,“50”)没有意义。一旦你创建了你的SessionFactory@orid-注释掉这些陈述。表示“在事务提交之前,它不会永久化”。那么,仅仅在一次数据库访问中就可以做到这一点吗?