JPA/休眠批量(批处理)插入
2022-09-01 17:30:39
以下是我在阅读了有关jpa大容量插入的几个主题后创建的简单示例,我有2个持久对象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善意地建议之后,我已经禁用了站点对象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
它的工作原理!