Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/342.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何配置要使用的事务管理器,而不必覆盖所有@Transactional方法_Java_Spring_Transactions - Fatal编程技术网

Java 如何配置要使用的事务管理器,而不必覆盖所有@Transactional方法

Java 如何配置要使用的事务管理器,而不必覆盖所有@Transactional方法,java,spring,transactions,Java,Spring,Transactions,长时间侦听器第一次调用 我们有一个AbstractService.java类,它包含公共事务逻辑。并非此类中的所有方法都是事务性的。其中一个是用spring的@Transactional注释注释的 现在AbstractService的每个实现都可能有一个不同的事务管理器。这可以通过重写抽象类中的方法在具体类中配置,并提供不同的tx管理器: @事务(值=事务管理器) 无法将事务管理器名称传递给抽象类,因为“注释属性Transactional.value的值必须是常量表达式” 因此,据我所知,配置事

长时间侦听器第一次调用

我们有一个AbstractService.java类,它包含公共事务逻辑。并非此类中的所有方法都是事务性的。其中一个是用spring的@Transactional注释注释的

现在AbstractService的每个实现都可能有一个不同的事务管理器。这可以通过重写抽象类中的方法在具体类中配置,并提供不同的tx管理器:

@事务(值=事务管理器)

无法将事务管理器名称传递给抽象类,因为“注释属性Transactional.value的值必须是常量表达式”

因此,据我所知,配置事务管理器有两种方法:

  • 重写具体类中的每个@Transactional方法,只是为了调用超级方法:

     @Transactional(timeout = 60, value = TRANSACTION_MANAGER)
     @Override
     public String editEntity(Integer id, Integer columnPosition, Object value) {
    return super.editEntity(id, columnPosition, value);
    
  • 改为在类级别添加@Transactional注释。这将强制在事务中处理非事务性方法,当非事务性方法调用其他事务性方法时,我们最终得到一个嵌套的tx soup

  • 还有第三种选择吗?类似于现在不推荐使用的spring测试的东西可以与上面的选项2一起使用

    差不多三年前有一个问题。从那以后,春天发生了很多事情,我们还有别的选择吗

    尽管自定义注释答案很简洁,但它并没有解决这个问题

    我的问题可以总结为:


    如何配置事务,而不必覆盖所有事务方法来指定事务管理器?

    我建议您将
    抽象服务重构为三类:

    • 第一个类是当前的
      抽象服务
      ,它的接口、方法签名等,以保持与任何现有子类的二进制兼容,但所有实现都已删除
    • 第二个类包含所有事务性的业务逻辑,因此它使用
      @transactional
      注释(在类级别使用正确的事务管理器)
    • 第三个类包含所有非事务性业务逻辑

    现在,您只需将最后两个类自动连接到重构的
    抽象服务
    ,它只是将传入的方法调用委托给移动到新创建的类之一的实现。

    感谢您的回复!第二类和第三类是抽象的吗?逻辑首先在AbstractService中的原因是,ConcreteClassA和ConcreteClassB可以扩展和访问公共逻辑。我正试着对你的答案感到困惑。在ClassA和ClassB场景中,这些是您的第二个类吗?在这种情况下,开始使用这种结构的主要原因将不复存在,因为现在逻辑将需要同时存在于两个类中。我可能误解了你的意思,我的想法是将AbstractService重构为一个抽象,委托给两个具体的类,一个是事务类,一个是非事务类。因此,当前扩展AbstractService的类中没有一个需要更改,我将在重构的基础上接受这个答案,以将事务方法分解为自己的类。另外,它还提出了一个解决方案,这是一个额外的优点。解决这个问题的另一种方法是使用抽象[SpecificTxMngr]服务扩展AbstractService,该服务覆盖所有事务方法并指定不同的txmngr。然后,每个需要特定txmngr的具体类将重写相关的抽象服务。这并不像公认的答案那样是正统的设计模式,但在每个开发人员的生活中总有一天需要接受继承。在我的特殊情况下,继承解决方案似乎更符合AbstractService的意图。