【问题标题】:Hibernate batch insert oracle 10g休眠批量插入oracle 10g
【发布时间】:2012-11-03 18:10:30
【问题描述】:

我想使用 HibernateTemplate 执行休眠批量插入,但我找不到包含此类的正确 jar。我知道它应该出现在 spring.jar 中,但无法找到下载 spring.jar 的位置。为了得到这个jar,我也尝试下载整个spring框架,但不幸的是在下载的包中没有找到类似spring.jar的东西。可能是名字改了,能告诉我在哪个 jar 中可以找到这个 HibernateTemplate 类吗??

另外,我们应该使用 HibernateTemplate 类在 hibernate 中进行批量插入,还是有其他更好的替代方法可以在 hibernate 中批量插入?

问候,

【问题讨论】:

    标签: java hibernate


    【解决方案1】:

    不建议使用 Hibernate 进行批处理。除非你已经有一个用 Hibernate 构建的业务层,并且你想重用一些代码,否则你应该在普通的旧 JDBC 中进行批处理,也许由 Spring Batch 之类的框架管理。

    如果你想使用 Hibernate,那么你应该使用StatelessSession

    不需要任何HibernateTemplate,因为 Session 已经为您提供了所需的一切。


    编辑: 你可以处理交易:

    Session session = sessionFactory.openStatelessSession();
    Transaction tx = session.beginTransaction();
    // DO SOMETHING
    tx.commit();
    session.close();
    

    顺便说一句,如果您为 10 个项目创建事务,那么我想您希望将处理拆分为 10 个插入的多个事务。交易真的需要吗?因为无论如何,一个事务可能会失败而其他事务不会,这会给您留下一些插入的实体,而另一些则没有。

    如果您希望批处理的原子性(全部插入或不插入),您必须为所有元素运行事务,而不仅仅是其中的 10 个。但是请注意不要锁定您的数据库...我认为将大型长时间运行的事务用于批处理并不是一个好主意。相反,您可能应该自行补偿插入失败。

    【讨论】:

    • 是的,我尝试使用HibernateTemplate,但遇到Transaction 等问题不适用于HibernateTemplateTransaction 将与 StatelessSession 一起使用吗?原因是,如果要插入 10 条记录,而第五条记录失败,那么我宁愿不插入任何记录,也不愿插入 4 条记录。如果我使用StatelessSession,这种要求将由Transaction 处理,对吗?请让我知道这件事。
    • StatelessSession 可以处理事务。
    • 那么补偿插入失败的可能选项是什么?您能就此提出一些建议吗?
    • 为失败的插入重新启动批处理,将它们标记为“notInserted”或类似的东西。如果您不解释为什么需要原子性,就很难说。
    【解决方案2】:

    HibernateTemplate 类是 org.springframework.orm-3.1.3.RELEASE.jar 的一部分,它包含在 spring-framework-3.1.3.RELEASE.zip

    如果您已经在项目中使用了 spring 框架,那么没有理由不使用 HibernateTemplate 进行批量更新。 HibernateTemplate 的优点是你不必关心 Hibernate Sessions

    【讨论】:

    • 不,使用spring框架不是我们项目的一个选项,只是为了实现我们计划使用它的批量插入。因此我问除了spring框架之外还有其他的hibernate批量插入吗?
    • @user182944 Hibernate Batch Processing 独立于 SpringFramework。 HibernateTemplate 只是简化数据访问代码的助手。我只回答了你的问题。在 Hibernate 文档Chapter 13. Batch Processing 中有一个关于批量更新的章节。示例Hibernate: Bulk Insert/Batch Insert。 Google 是您的朋友。
    • 我尝试使用 HibernateTemplate,但遇到了一个困难。假设有 10 条记录要插入,第 5 条记录失败,那么前 4 条记录会被执行,一旦第 5 条记录失败,剩下的插入查询根本不会被执行。我需要在这里知道两件事:1)是否有一些设置可以让所有记录都被插入,如果任何一个失败,那么十个记录都不应该插入? 2)即使第五条记录失败,我想继续插入剩余的记录。如何实现这些?请帮忙
    • @andih:HibernateTemplate 本身的文档不鼓励使用此类,并建议直接使用本机 Hibernate API。所以有一个很好的理由不使用 HibernateTemplate:它没有增加太多价值,甚至在 Hibernate 4 中也不存在了。
    • @JBNizet 当您将 Springframework Transactionmanagement 与另一个 TransactionManager 一起使用而不是 HibernateTransactionManager 时,它具有一些优势。我认为批量更新没有任何优势,但如果项目中已经使用了 springframework,我也没有理由不使用它。
    猜你喜欢
    • 2015-08-01
    • 1970-01-01
    • 2020-09-26
    • 1970-01-01
    • 1970-01-01
    • 2015-09-08
    • 2012-11-18
    • 2012-08-14
    • 1970-01-01
    相关资源
    最近更新 更多