Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 可以冬眠';的批插入机制可用于仅使用一个插入查询插入多个记录_Java_Hibernate_Jpa_Jdbc_Hibernate Batch Updates - Fatal编程技术网

Java 可以冬眠';的批插入机制可用于仅使用一个插入查询插入多个记录

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

我正在使用Hibernate插入同一类的多个对象。问题是Hibernate为每个对象生成一个插入查询。相反,我需要一个包含所有插入值的查询

我的代码用于在Customer表(MySql)中插入/更新Customer类的对象,如下所示:

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语句的响应返回。在多值插入的情况下,这显然不起作用。