使用@Transactional注释批量插入

时间:2015-11-25 08:34:57

标签: spring hibernate transactions

在我的spring应用程序中,我希望一次性在数据库中插入近1500条记录。我在后端使用Spring 4.X和普通的hibernate。在我的服务层中,我使用@Transactional注释。现在,在某些点之后插入记录时,我会出现内存错误。在互联网上搜索后,我发现我们可以使用与此类似的东西

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
    if ( i % 20 == 0 ) { //20, same as the JDBC batch size
        //flush a batch of inserts and release memory:
        session.flush();
        session.clear();
    }
}

tx.commit();
session.close();

但是,在上面的代码中,他们手动使用sessionFactory和事务,并在会话对象上使用flush和clear,并进行手动提交。

在我的情况下,我不想使用上面的代码,我想使用@Transactional注释来使这项工作。

请建议

我不想手动使用会话工厂和事务对象。 .... @ transactional应该全部完成

1 个答案:

答案 0 :(得分:0)

如果您想从BMT(Bean管理事务)更改为CMT(容器事务管理),您的代码片段将变为:

@Transactional(propagation=Propagation.REQUIRES_NEW)
public void saveCustomers(){
    for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
    }
}

当方法结束时,容器将刷新所有实体。现在我想问你,为什么你需要每20个实体?