使用hibernate批量插入/更新

时间:2012-09-07 21:25:47

标签: hibernate

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

MyDAO扩展了这门课程。 我有1000个我希望hibernate持久存在的对象。我是否在每一个上调用MyDAO.save(对象)。这对我来说似乎效率很低。这会导致每次数据库命中吗?有没有办法同时插入大量的对象?s

1 个答案:

答案 0 :(得分:4)

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

如果您还没有阅读Hibernate手册的this章,那当然值得一读。有一些有用的提示可以保持你的会话很小,以避免大量的脏检查等。如果你只是插入1000个对象而不驱逐任何以前的对象,操作将变得越来越慢,因为Hibernate必须脏,检查越来越多的对象。

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

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

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