不使用休眠模板的服务方法

Posted

技术标签:

【中文标题】不使用休眠模板的服务方法【英文标题】:Service methods without using hibernate template 【发布时间】:2012-04-25 22:17:14 【问题描述】:

我已经在谷歌上搜索了几个小时,试图找到一个示例,说明如何在使用 DAO 接口时编写一个不使用 Springs Hibernate 模板的服务方法。让我感到困惑的是,当我将 @Transactional 注释放在服务层而不是 DAO 中时会发生什么。 Service 方法/DAO 接口是否可以互换?

Here is an example where the @Transactional is in the DAO

Here is one with the @Transactional in the Service Layer but using hibernate templates

感谢您的帮助!

【问题讨论】:

【参考方案1】:

Spring documentation 建议完全避免使用 HibernateTemplate,而直接使用 Hibernate API:

注意:从 Hibernate 3.0.1 开始,事务性 Hibernate 访问代码可以 也可以用简单的 Hibernate 风格编码。因此,对于刚开始 项目,考虑采用标准的 Hibernate3 编码风格 相反,数据访问对象,基于 SessionFactory.getCurrentSession()。

并且@Transactional注解应该总是放在服务层的方法上。这是划分事务的层。

阅读http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#orm-session-factory-setup 了解如何设置会话工厂。完成后,可以将会话工厂注入您的 DAO:

@Repository
public class MyDAO 
    @Autowired
    private SessionFactory sessionFactory;

    ...

【讨论】:

谢谢,这帮了我很大的忙,但我仍然对服务方法和 DAO 目的之间的区别有点困惑。你有没有机会给我(或指出我的方向)一个他们如何相互作用的例子? 阅读这个答案和后面的 cmets:***.com/questions/8754840/… 这正是我正在寻找的信息!谢谢你。关于你所说的关于调用多个 DAO 的服务层,我有一个后续问题。我会为我希望执行的每个任务编写一个单独的 DAO 吗?另外我想知道一点题外话,创建一个 Dao 然后一个 DaoImplementation 有什么用?谢谢! 就像其他所有类一样,您将在一个 DAO 中将逻辑上组合在一起的方法分组。例如,您可以将与给定实体或一组实体相关的所有方法分组到单个 DAO 中。接口主要用于单元测试,以便能够模拟 DAO 并测试依赖它的服务。

以上是关于不使用休眠模板的服务方法的主要内容,如果未能解决你的问题,请参考以下文章

bootstrap模板怎么部署到自己的服务器上?

不使用模板参数的 C++ 模板类方法

验证码识别之模板匹配方法

Sonata admin 不推荐使用设置模板的方法?

VueJS 如何编译服务器端远程模板异步组件+简单方法

使用模板方法进行不一致的字符串排序