Java 可以冬眠';的批插入机制可用于仅使用一个插入查询插入多个记录
我正在使用Hibernate插入同一类的多个对象。问题是Hibernate为每个对象生成一个插入查询。相反,我需要一个包含所有插入值的查询 我的代码用于在Customer表(MySql)中插入/更新Customer类的对象,如下所示:Java 可以冬眠';的批插入机制可用于仅使用一个插入查询插入多个记录,java,hibernate,jpa,jdbc,hibernate-batch-updates,Java,Hibernate,Jpa,Jdbc,Hibernate Batch Updates,我正在使用Hibernate插入同一类的多个对象。问题是Hibernate为每个对象生成一个插入查询。相反,我需要一个包含所有插入值的查询 我的代码用于在Customer表(MySql)中插入/更新Customer类的对象,如下所示: Session session = sessionFactory.openSession(); Transaction tx = session.beginTransaction(); List<Customer> customers;//this l
Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();
List<Customer> customers;//this list list will contain all the customers
int i=0;
while ( customers.hasNext() ) {
Customer customer = customers.next();
session.saveOrUpdate(customer);
if ( i % 50 == 0 ) { //50, same as the JDBC batch size
//flush a batch of inserts and release memory:
session.flush();
session.clear();
}
i++;
}
tx.commit();
session.close();
INSERT INTO acct_doc_header (pk, name, age)
VALUES
(1,'Doe',10);
INSERT INTO acct_doc_header (pk, name, age)
VALUES
(2,'Eoe',10);
INSERT INTO acct_doc_header (pk, name, age)
VALUES
(3,'Foe',10);
INSERT INTO acct_doc_header (pk, name, age)
VALUES
(4,'Joe',10);
INSERT INTO acct_doc_header (pk, name, age)
VALUES
(5,'Koe',10);
相反,我想要一个包含所有语句的单insert查询。大概是这样的:
INSERT INTO acct_doc_header (pk, name, age)
VALUES
(1,'Doe',10),
(2,'Eoe',10),
(3,'Foe',10),
(4,'Joe',10),
(5,'Koe',10);
这可以通过Hibernate实现吗?我认为它应该得到Hibernate的支持。我搜索过各种各样的文章,但运气不好
如果有帮助的话,我将在我的应用程序中使用Hibernate 5.2.16和Spring 4.3.15。AFAIK这是不可能的,但这也不是一个缺点(除了一些可读性)。性能方面没有(实际的)区别,因为大部分时间用于创建/提交/回滚transactions@XtremeBaumer事实上,我尝试了这两种方法,我可以看到500多张唱片的性能有所不同。虽然单独插入大约需要7秒,但单个插入查询只需要0.6秒。考虑到我的应用程序的大小,这种6-7秒的差异对于meHibernate来说是相当大的,Hibernate并不是执行大规模数据迁移的最佳工具。我将不得不转而使用普通的JDBC批处理插入来大幅提高速度。这基本上会达到您的目的-一次往返插入批量大小的行。@DockYard您检查过每种方法使用的事务数了吗?我认为Hibernate应该支持它。为了满足JPA规范,在新实体持久化之后,ID必须可用。根据数据库的不同,生成的密钥可以作为insert语句的响应返回。在多值插入的情况下,这显然不起作用。