Spring和Hibernate事务

Spring和Hibernate事务,hibernate,spring,Hibernate,Spring,我是Spring新手,我刚刚阅读了关于Hibernate-Spring集成(版本3)的文档。我不明白为什么自动事务管理(声明性事务管理)应用于文档中的“服务”,而直接应用于DAO实现。特别是我不明白他们所说的服务是什么意思,与DAO相比有什么区别,以及这是否真的需要提供Hibernate与Spring的集成 我试图做的是只使用Hibernate DAO实现,并用XML进行配置,以便在实例化时设置会话工厂。无论如何,这会引发异常,因为Spring不允许非事务性hibernate访问。所以,为了添加

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

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

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

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

更正:存储库而非资源

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

  • 使用Spring Hibernate模板类(在Spring 3.0中不推荐使用)
  • 手工操作,并通过注释标记DAO类(这类似于@Service,(因为和仅表示提供的子类))

    • 我不能说是春天,但我将用一种通用的方式回答这个问题:

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

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

      在这种情况下,服务将如下所示:

      transfer(Account to, Account from, double value)
      
      updateBalance(Account account, double amount)
      
      刀看起来是这样的:

      transfer(Account to, Account from, double value)
      
      updateBalance(Account account, double amount)
      
      transfer
      方法将调用
      updateBalance
      两次,每次操作调用一次


      现在我对Spring不是很熟悉,所以,如果您的业务需求不需要,我不确定Spring是否(以及为什么)会要求您的应用程序有一个额外的层

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


      服务的职责是协调业务逻辑。例如,您的用户提交了两个项目。您不会自动将它们保存到数据库中。如果项目有效,您可能需要先验证。您可能还希望过滤或丰富与这些项目相关联的数据。完成验证和筛选/充实后,就可以将其保存到数据库中。要保存项目,请使用DAO

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

      如果您希望直接从控制器调用DAO(有时在域驱动设计的上下文中,甚至在分层设计中,您只是希望直接调用DAO而不是实现直通服务层方法),则需要在DTO上进行事务处理


      只要适当设置DAO上的事务传播,事务服务和DAO就可以很好地协同工作。也就是说,在存在事务的情况下使用现有事务,但如果没有事务,则创建新事务。

      @Resource
      不是组件注释,而是JSR-250替代
      @Autowired
      。DAOs的首选注释是
      @Repository
      。参考文献:a)b)和
      HibernateTemplate
      即将被弃用。现在就开始使用它是不明智的。@Sean Patrick Floyd我的错误我想写@Repository这是否意味着当我使用Spring 3时,我总是要提供服务?因为否则我无法设置事务,Spring3不允许that@gotch4使用所谓的Spring托管bean(服务就是其中之一)。Spring控制的事务最好用在这个托管bean中但不要担心,我希望您(以正确的方式)构建一个新的Spring应用程序,所有(可以)东西都会变成Spring管理的bean。