一尘不染

JPA /休眠批量(批量)插入

hibernate

这是我在阅读有关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 Ken提出建议之后,我已禁用了自动生成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();

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

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

有用!


阅读 191

收藏
2020-06-20

共1个答案

一尘不染

如果您使用数据库生成ID,则Hibernate必须执行查询以为每个实体生成主键。

2020-06-20