这是我在阅读有关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
有用!
如果您使用数据库生成ID,则Hibernate必须执行查询以为每个实体生成主键。
问题内容: 使用休眠时,当我尝试使用以下方式启用批量插入时 我得到以下输出: 然后这个: 基本上没有。 我是否缺少设置? 问题答案: 原来这种情况下缺少的是: 参考:https : //forum.hibernate.org/viewtopic.php ? p =2374413,https : //stackoverflow.com/a/5240930/32453 或可能是hibernate.or
问题内容: 该程序一个接一个地执行数以万计的连续插入。我以前从未使用过Hibernate。我的性能变得非常慢(如果我只是手动连接并执行SQL,则速度会提高10-12倍。根据许多休眠教程,我的batch_size设置为50。 这是单个插入的日志-也许您可以帮助我准确了解正在发生的事情: 问题答案: 当您调用时,hibernate将生成一个INSERT SQL。该INSERT SQL将附加在刷新期间(
问题内容: 我有一个dao,它基本上使用hibernate将记录插入到一个表中,该dao用标记为注释,并且我有一个服务,该服务会生成其他一些东西,然后调用我的dao。我的服务也标注了使用。 我叫服务循环。我在dao上的插入内容是否可以批量或一个接一个地工作?我如何确定它们可以批量工作?hibernateTransaction Manager是否管理批处理插入? 我正在使用Oracle DB。
我正在写一个数据挖掘程序,可以批量插入用户数据。 当前SQL只是一个普通的批量插入: 如果发生冲突,如何进行更新?我试过: 但它抛出
问题内容: 有没有一种方法可以使用JPA EntityManager使用批处理插入。我知道没有直接方法可以实现这一目标,但是必须有某种方法可以实现这一机制。 实际上,对于每一次插入操作,我要花300毫秒,我想减少使用批量插入而不是单次插入的时间。 这是我目前正在执行的用于单次插入的代码 提前致谢。 问题答案: 它 是 可以进行使用JPA成批写操作,但它是高度依赖于具体的实现你的持久性提供数据库和J
问题内容: 我正在使用Python中的MySQLdb模块与数据库进行交互。我遇到的情况是有一个非常大的列表(成千上万个元素),需要将它们作为行插入表中。 我现在的解决方案是生成一个大的语句作为字符串并执行它。 有没有更聪明的方法? 问题答案: 有一种更聪明的方法。 批量插入的问题在于,默认情况下启用了自动提交功能,从而导致每个语句在下一次插入可以启动之前被保存到稳定存储中。 如手册页所述: 默认情