首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用hibernate 4和spring 3.x批量插入记录

使用hibernate 4和spring 3.x批量插入记录
EN

Stack Overflow用户
提问于 2013-01-02 14:48:59
回答 2查看 1.5K关注 0票数 0

java代码:

代码语言:javascript
运行
复制
EntityManager em1 = entityService.getEntityManager();
Query qury1 = em1.createNamedQuery(Constants.UNPROCESSED_CONTACTS);
List<Contact> contacts =  entityService.findByNamedQuery(qury1);

我这里有所有联系人的列表,我想添加100批所有联系人。我使用的是hibernate 4和spring 3.1,我的applicationContext是

代码语言:javascript
运行
复制
 <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
 </bean>

<bean class="org.springframework.orm.jpa.JpaTransactionManager"
    id="transactionManager">
    <property name="entityManagerFactory" ref="entityManagerFactory" />
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />

我如何才能继续下去。在adv中谢谢。

EN

回答 2

Stack Overflow用户

发布于 2013-01-02 15:00:25

JPA本身不提供批插入功能,但hibernate提供了。我看到您已经有了一个sessionFactory bean。因此您只需遵循hibernate docs中的示例即可

代码语言:javascript
运行
复制
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

ScrollableResults customers = session.getNamedQuery("GetCustomers")
    .setCacheMode(CacheMode.IGNORE)
    .scroll(ScrollMode.FORWARD_ONLY);
int count=0;
while ( customers.next() ) {
    Customer customer = (Customer) customers.get(0);
    customer.updateStuff(...);
    if ( ++count % 20 == 0 ) {
        //flush a batch of updates and release memory:
        session.flush();
        session.clear();
    }
}

tx.commit();
session.close();
票数 1
EN

Stack Overflow用户

发布于 2014-12-15 19:14:33

参考:https://docs.jboss.org/hibernate/orm/3.3/reference/en/html/batch.html

用于大容量插入的

代码语言:javascript
运行
复制
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();

和在hibernate XML配置中:

代码语言:javascript
运行
复制
<entry key="hibernate.jdbc.batch_size">50</entry>

一起做这些事情,你可以比以前的类型更快地插入。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14117956

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档