1

我正在使用类似于 http://code.google.com/p/struts2-jquery/source/browse/showcase-grid/src/com/jgeppert/struts2/jquery/grid/showcase/dao中的表单的类 AbstractSimpleGenericDao /AbstractSimpleGenericDao.java?r=322

MyDAO 扩展了这个类。我有 1000 个我希望休眠的对象。我是否在每一个上调用 MyDAO.save(object)。这对我来说似乎非常低效。这是否每次都会导致数据库命中?有什么方法可以同时插入很多对象吗?

4

1 回答 1

4

您确实必须对要保存到数据库的每个项目调用 save 。值得记住的是,Hibernate 是一个 ORM。它可用于批量插入,但通常不是最有效的方法。

如果您还没有阅读 Hibernate 手册的这一章,那当然值得一读。那里有一些有用的技巧,关于保持会话较小以避免大量脏检查等。如果您只插入 1000 个对象而不驱逐任何先前的对象,则操作将变得越来越慢,因为 Hibernate 必须对越来越多的对象进行脏检查。

Hibernate 实际执行插入的方式被设计为尽可能高效。可以批处理插入以利用数据库优化。值得记住的是,如果您使用基于标识的生成器,例如在 MySQL 上,您将失去任何批处理优势。这是因为 Hibernate 必须实际执行插入才能在将对象插入会话时生成标识符。

您可以实施替代标识符生成策略以确保您不需要这样做。一种可能性可能是存储每个实体的当前最高标识符的表。然后 Hibernate 可以以适当大小的批次从该表中请求标识符。

如果你发现 Hibernate 很慢,你总是可以回退到普通的旧 JDBC 来完成这项任务。

于 2012-09-08T02:27:44.683 回答