在服务层中自动装配sessionFactory

时间:2015-04-20 08:28:51

标签: spring hibernate design-patterns

目前我只是为了事务管理而在我的服务类中自动装配sessionfactory。我在服务中创建(hibernate)会话并基于来自DAO层的响应,执行事务提交/回滚。

我的业务逻辑要求我在单个事务中更新两个以上的数据库表。

从设计的角度来看,我对在服务层中自动连接sessionFactory持怀疑态度。

还有其他替代方法吗?

谢谢

3 个答案:

答案 0 :(得分:2)

服务层的事务管理并不是一个糟糕的设计。如果您不想为了分离问题而在服务层中自动装配ssession工厂,您可以

  1. 将事务管理逻辑明确委派给您自己的自定义事务管理类。 OR
  2. 使用AOP并使用注释/ XML,spring提供了很好的支持。

答案 1 :(得分:1)

总的来说,我同意其他人说明交易通常是在服务级别上启动的(取决于您当然需要的粒度)。

然而,与此同时,我也开始将@Transactional(propagation = Propagation.MANDATORY)添加到我的DAO层(以及其他不允许启动事务但需要现有事务的层),因为它更容易检测到错误忘记在调用者中启动事务的地方(例如服务)。如果您的DAO使用强制传播进行注释,您将获得一个异常,说明在调用该方法时没有活动事务。

我还有一个集成测试,我检查所有bean(bean post processor)以获取此注释,如果在不属于服务层的bean中存在除Mandatory以外的传播的@Transactional注释,则会失败。这样我就确保我们不会在错误的层上启动事务。

最初来自Where does the @Transactional annotation belong?

答案 2 :(得分:-1)

不是这样。 Spring MVC有一个设计结构。你必须遵守这一点。 在服务层中嵌入DAO层是不正确的方法。 DAO层负责处理与事务相关的事情。 服务层将像抽象一样工作。有什么需要将它们包装成单一的?