Spring和Hibernate事务

3
我刚开始接触Spring框架,正在阅读有关Hibernate-Spring集成(版本3)的文档。我不明白为什么自动事务管理(声明式管理)应用于文档中的“服务”,而不是直接应用于DAO实现。特别是我不理解他们所说的服务是什么,与DAO相比有何区别,以及是否真的需要提供Hibernate与Spring的集成。
我尝试的方法是只使用Hibernate DAO实现,并在XML中配置,在实例化时设置SessionFactory。然而,这会导致异常,因为Spring不允许非事务性Hibernate访问。那么,为了添加事务性访问,我必须添加那个“服务”吗?它与简单的DAO有何不同?
4个回答

6

我无法对 Spring 给出具体答案,但我会以通用的方式回答这个问题:

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

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

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

transfer(Account to, Account from, double value)

而DAO将如下所示:

updateBalance(Account account, double amount)
< p> transfer 方法将调用 updateBalance 两次,每次操作一次。

我最近不太熟悉Spring,所以不确定(以及为什么)Spring是否需要您的应用程序有一个额外的层,如果您的业务需求不需要这样做。


3

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

服务是(Spring中的)术语,用于提供某些(业务)服务功能的(大多数单例)类。它也是声明Spring中的类为服务的注释的名称。

更正:应该使用Repository而不是Resource

在Spring中,有许多实现DAO的方法,其中最常见的两种是:

  • 使用Spring Hibernate Template类(在Spring 3.0中已弃用)
  • 手动完成,并使用@Repository注释标记DAO类(类似于@Service,因为@Repository@Service仅提供@Component的子类)

2
@Resource 不是一个组件注解,它是 JSR-250 中 @Autowired 的替代。DAO 的首选注解是 @Repository参考资料: a) @Resource b) @Component 和其他构造型注解 - Sean Patrick Floyd
1
而且HibernateTemplate正在逐渐被淘汰,现在开始使用它并不明智。 - Sean Patrick Floyd
@Sean Patrick Floyd,我的错误,我想写@Repository。 - Ralph
这是否意味着当我使用Spring 3时,我总是需要提供一个Service?否则我无法设置事务,而Spring 3不允许这样做。 - gotch4
@gotch4 在使用所谓的Spring管理Bean(其中服务是其中之一)。Spring控制的事务最好在这些管理的Bean中使用。但不用担心,如果您以正确的方式构建新的Spring应用程序,几乎所有内容都可以成为Spring管理的Bean。 - Ralph

1
DAO的职责是封装对数据库的数据访问。在数据库中进行数据访问的示例包括保存、添加、删除和获取。请注意,它与任何业务逻辑无关。
服务的职责是编排业务逻辑。例如,您的用户已提交了两个项目。您不会自动将它们保存到数据库中。您可能需要先验证这些项目是否有效。您可能还想过滤或丰富与这些项目相关联的数据。完成验证和过滤/丰富后,就可以将其保存到数据库中了。要保存您的项目,您可以使用DAO。

0

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

如果您想直接从控制器调用DAO(这在领域驱动设计的上下文中有时会发生,甚至在分层设计中,您只想直接调用DAO而不是实现透传服务层方法),则需要在DTO上使用事务。

只要DAO上的事务传播设置得当,事务服务和DAO可以很好地协同工作。即,如果存在现有事务,则使用现有事务,但如果不存在事务,则创建一个新事务。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接