gpt4 book ai didi

java - JPA/Hibernate 批量(批量)插入

转载 作者:IT老高 更新时间:2023-10-28 20:28:29 31 4
gpt4 key购买 nike

这是我在阅读了几个关于 jpa 批量插入的主题后创建的简单示例,我有 2 个持久对象用户和站点。一个用户可以有多个站点,所以我们在这里有一对多的关系。假设我想创建用户并将多个站点创建/链接到用户帐户。考虑到我愿意为 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()

所以,我的意思是“真正的”批量插入不起作用或者我很困惑?

这里是 source code对于此示例项目,这是 maven 项目,因此您只需下载并运行 mvn install 即可检查输出。

更新:

经过 Ken Liu 的善意建议,我已禁用 Site object id auto generation:

    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();

现在我在调试输出中有以下行:

调试:org.hibernate.jdbc.AbstractBatcher - 执行批量大小:2

有效!

最佳答案

如果您使用数据库生成 id,那么 Hibernate 必须执行查询来为每个实体生成主键。

关于java - JPA/Hibernate 批量(批量)插入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2773302/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com