使用hibernate进行批插入/更新

使用hibernate进行批插入/更新,hibernate,Hibernate,我使用的类AbstractSimpleGenericDao与中的表单类似 MyDAO扩展了这个类。 我有1000个对象希望hibernate持久化。我是否在每个对象上调用MyDAO.save对象。这对我来说似乎效率很低。这是否每次都会导致DB命中?有什么方法可以同时插入许多对象吗?确实,对于要持久保存到数据库中的每个项目,都必须调用save。值得记住的是,Hibernate是一种ORM。它可以用于批量插入,但通常不是最有效的方法 如果您还没有读过Hibernate手册的一章,那么一定值得一读。

我使用的类AbstractSimpleGenericDao与中的表单类似

MyDAO扩展了这个类。
我有1000个对象希望hibernate持久化。我是否在每个对象上调用MyDAO.save对象。这对我来说似乎效率很低。这是否每次都会导致DB命中?有什么方法可以同时插入许多对象吗?确实,对于要持久保存到数据库中的每个项目,都必须调用save。值得记住的是,Hibernate是一种ORM。它可以用于批量插入,但通常不是最有效的方法

如果您还没有读过Hibernate手册的一章,那么一定值得一读。这里有一些关于保持会话小以避免大量脏检查等的有用提示。如果只插入1000个对象而不逐出任何以前的对象,操作将变得越来越慢,因为Hibernate必须脏检查越来越多的对象

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

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


如果您发现Hibernate运行缓慢,您可以使用普通的JDBC来完成此任务。

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

如果您还没有读过Hibernate手册的一章,那么一定值得一读。这里有一些关于保持会话小以避免大量脏检查等的有用提示。如果只插入1000个对象而不逐出任何以前的对象,操作将变得越来越慢,因为Hibernate必须脏检查越来越多的对象

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

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


如果您发现Hibernate运行缓慢,您可以使用普通的JDBC来完成此任务。

非常感谢您提到的自动生成密钥会失去批处理优势的说法。我不知道!!!:-非常感谢关于自动生成密钥失去批量优势的评论。我不知道!!!:-