在阅读了关于jpa批量插入的几个话题后,我创建了一个简单的示例。 我有两个持久化对象User和Site。 一个用户可以拥有多个站点,因此我们在这里有一对多的关系。 假设我想创建一个用户并将几个站点链接到用户帐户。 这是代码的样子,考虑到我想要使用Site对象的批量插入。
User user = new User("John Doe");
user.getSites().add(new Site("google.com", user));
user.getSites().add(new Site("yahoo.com", user));
EntityTransaction tx = entityManager.getTransaction();
tx.begin();
entityManager.persist(user);
tx.commit();
但是当我运行这段代码时(我使用Hibernate作为JPA实现提供者),我看到以下SQL输出:
Hibernate: insert into User (id, name) values (null, ?)
Hibernate: call identity()
Hibernate: insert into Site (id, url, user_id) values (null, ?, ?)
Hibernate: call identity()
Hibernate: insert into Site (id, url, user_id) values (null, ?, ?)
Hibernate: call identity()
那么,我的意思是“真正的”批量插入不起作用,还是我被搞糊涂了?
这里是示例项目的源代码,这是一个Maven项目,所以只需下载并运行mvn install即可检查输出。
更新:
在Ken Liu的友情建议下,我已禁用了Site对象ID自动生成:
User user = new User("John Doe");
user.getSites().add(new Site(1, "google.com", user));
user.getSites().add(new Site(2, "yahoo.com", user));
entityManager.setFlushMode(FlushModeType.COMMIT);
EntityTransaction tx = entityManager.getTransaction();
tx.begin();
entityManager.persist(user);
tx.commit();
现在我在调试输出中看到以下内容:
DEBUG: org.hibernate.jdbc.AbstractBatcher - 执行批量大小:2
它可以工作!
UPDATE sometbl SET counter=counter+1000
,然后只使用它刚刚保留的 1000 个 ID? - aioobe