【问题标题】:Spring and Hibernate transactionsSpring 和 Hibernate 事务
【发布时间】:2011-06-13 02:22:33
【问题描述】:

我是 Spring 新手,我只是在阅读有关 Hibernate-Spring 集成(版本 3)的文档。我不明白为什么将自动事务管理(声明性的)应用于文档中的“服务”,而不是直接应用于 DAO 实现。特别是我不明白他们所说的服务是什么意思,与 DAO 相比有什么区别,以及是否真的需要提供 Hibernate 与 Spring 的集成。

我试图做的是仅使用 Hibernate DAO 实现并在 XML 中配置以在实例化时设置会话工厂。无论如何,这会引发异常,因为 Spring 不允许非事务性休眠访问。所以为了添加事务访问,我必须添加那个“服务”吗?这与简单的 DAO 有何不同?

【问题讨论】:

    标签: hibernate spring


    【解决方案1】:

    我不能说Spring,但我会以通用的方式回答这个问题:

    特别是我不明白他们所说的服务是什么意思,与 DAO 相比有什么区别

    想象一下经典的“汇款”场景,其中一位客户向另一位客户汇款。这里有一个“服务”(汇款),分两步完成:从账户 A 中扣款,向账户 B 中充值。这两个步骤应该在一个事务中进行,即使它们中的每一个都进行数据库操作。如果交易在第二步失败,第一步也应该被取消。

    在这种情况下,服务看起来像这样:

    transfer(Account to, Account from, double value)
    

    DAO 看起来像这样:

    updateBalance(Account account, double amount)
    

    transfer 方法将调用 updateBalance 两次,每个操作调用一次。

    这些天我对 Spring 不是很熟悉,因此,如果您的业务需求不需要,我不确定 Spring 是否(以及为什么)要求您的应用程序有一个额外的层。

    【讨论】:

      【解决方案2】:

      DAO(数据访问对象)只是一种设计模式或实现该模式的类的名称。

      Service 是一个 (Spring) 术语,表示提供一些(业务)服务功能的(最类似于单例的)类。在Spring中将类声明为服务也是Annotation的名称。

      更正:存储库而不是资源

      在春季有很多方法可以实现 DAO,最常见的两种方法是:

      • 使用 Spring Hibernate 模板类(在 Spring 3.0 中已弃用)
      • 手工操作,并通过@Repository注解标记DAO类(这与@Service类似,(因为@Repository@Service仅表示提供@Component的子类))

      【讨论】:

      • @Resource 不是组件注解,它是 JSR-250 对 @Autowired 的替代品。 DAO 的首选注解是@Repository参考: a) @Resource b) @Component and further stereotype annotations
      • HibernateTemplate 即将弃用。现在开始使用它是不明智的。
      • @Sean Patrick Floyd 我的错误我想写@Repository
      • 这是否意味着当我使用 Spring 3 时,我总是要提供一个 Service?因为否则我无法设置事务并且 Spring 3 不允许这样做
      • @gotch4 在使用所谓的 Spring Managed Beans(服务就是其中之一)。 Spring 控制的 Transaction 最好用在这个 Managed Beans 中。 -- 但别担心,我(以正确的方式)构建了一个新的 Spring 应用程序,几乎所有东西(可以)都变成了 Spring 管理的 bean。
      【解决方案3】:

      DAO 的职责是封装对数据库的数据访问。数据库中数据访问的示例包括保存、添加、删除和获取。请注意,它与任何业务逻辑无关。

      Service 的职责是编排业务逻辑。例如,您的用户提交了两个项目。您不会自动将它们保存到数据库中。如果项目有效,您可能需要先验证。您可能还想过滤或丰富与这些项目关联的数据。一旦你完成了验证和过滤/丰富,那么这就是你保存它来做数据库的时候了。要保存您的项目,您可以使用 DAO。

      【讨论】:

        【解决方案4】:

        您可以将事务语义应用于服务和 DAO。通常,您希望它们至少应用于服务,因为您的服务方法有时会涉及对需要成为同一事务的一部分的多个 DAO 的调用。 (如果您可以在 SQL 中完成所有事情,但不能总是这样做,那就太好了。)

        如果您想直接从控制器调用 DAO(这有时会发生在域驱动设计的上下文中,或者甚至在您更喜欢直接调用 DAO 而不是实现传递服务层方法的分层设计中) ),您需要在 DTO 上进行交易。

        只要正确设置 DAO 上的事务传播,事务服务和 DAO 就可以很好地协同工作。 IE。使用现有的交易,如果没有,则创建一个新的。

        【讨论】:

          猜你喜欢
          • 2015-03-26
          • 2012-06-03
          • 2015-05-10
          • 2021-11-17
          • 1970-01-01
          • 2012-10-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多