Spring 服务层中的自动连线sessionFactory

Spring 服务层中的自动连线sessionFactory,spring,hibernate,design-patterns,Spring,Hibernate,Design Patterns,目前我在服务类中自动连接sessionfactory只是为了事务管理。我在服务中创建(hibernate)会话,并基于DAO层的响应,执行事务提交/回滚。我的业务逻辑要求我在单个事务中更新两个以上的数据库表。从设计角度来看,我对服务层中的autowire sessionFactory表示怀疑。还有其他替代方案吗?谢谢服务层的事务管理设计不错。如果您不想为了分离关注点而在服务层中自动连接ssession factory,您可以 显式地将事务管理逻辑委托给您自己的自定义事务管理类。或 使用AOP和a

目前我在服务类中自动连接sessionfactory只是为了事务管理。我在服务中创建(hibernate)会话,并基于DAO层的响应,执行事务提交/回滚。我的业务逻辑要求我在单个事务中更新两个以上的数据库表。从设计角度来看,我对服务层中的autowire sessionFactory表示怀疑。还有其他替代方案吗?谢谢

服务层的事务管理设计不错。如果您不想为了分离关注点而在服务层中自动连接ssession factory,您可以

  • 显式地将事务管理逻辑委托给您自己的自定义事务管理类。或
  • 使用AOP和annotations/XML,spring提供了良好的支持
    不是这样。SpringMVC有一个设计结构。你必须遵守这一点。 将DAO层嵌入服务层是不正确的方法。 DAO层负责处理与事务相关的事情。
    服务层将像抽象一样工作。什么是需要将它们打包成一个呢?

    一般来说,我同意其他人的说法,即事务通常是在服务级别上启动的(当然取决于您需要的粒度)

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

    我还进行了一个集成测试,在该测试中,我检查所有bean(bean后处理器)是否有此注释,如果不属于服务层的bean中存在传播不是必需的@Transactional注释,则会失败。通过这种方式,我确保我们不会在错误的层上启动事务


    最初从

    中获得,您能更详细地介绍一下吗?它是一个基于REST API的web应用程序,业务逻辑将由服务处理。当前此服务类具有autowired sessionfactory字段。在任何DAO调用之前,将使用openSession()方法创建会话,并使用beginTransaction启动事务()。根据DAO调用结果,事务将提交或回滚。我的首选是保留所有与DB相关的实体(即会话、sessionfactory等)在DAO类本身中。但是。如果我这样做,我认为我不能在服务类中处理事务。如果这是一种新的设计,我建议使用Spring数据,而不是手工编写DAO。请不要这样做,因为这将导致您走上一条不平坦的道路,并最终导致无法维护的代码库。解决方案很简单,不要使用手动事务,让spring为您做到这一点,只需使您的服务方法具有事务性。spring将为您打开一个会话,并在该方法完成后提交它,所有dao调用都将参与该事务并使用同一个会话。这在spring参考指南中都有解释。您确定吗?dao层负责为您执行实际的IO数据库,但事务通常在服务级别进行管理,以允许每个表有一个DAO类,每个事务有多个表,但每个服务调用只有一个事务。