Hibernate 4 + Spring 3.2 +交易:一个服务,几个Dao,一个方法

时间:2013-07-25 08:34:10

标签: spring hibernate service transactions dao

我是hibernate 4& S的初学者Spring 3.2的东西。 我已经阅读了一些关于堆栈的教程和讨论,但我没有找到我的问题的明确答案。我认为理解的最佳方式是询问和分享知识!

我们走吧! 因此,每次使用带注释事务的方法创建Pojo,Dao,Service类。没关系。我正在使用Sessionfactory来处理我的交易。我在寻找好的做法。

1-如果您想使用相同服务中的删除方法和保存方法,您将如何使其在同一个交易中运作。当我查看日志时,每个方法都在不同的事务中执行。

此SampleServiceImpl:

    @Transactional
    public void save(Sample sample){

        sampleDao.save(sample);
    }
    @Transactional
    public void delete(Sample sample){

        sampleDao.delete(sample);
    }

// A solution could be that , but not very clean...there should be an another way, no?

        @Transactional
        public void action(Sample sample){

        sampleDao.save(sample);

        sampleDao.delete(sample);
    }

2-如果要从其他服务类中使用“删除方法”和“保存方法”,您将如何使其在同一事务中起作用。因为每个服务类中的每个方法都由Transactionnal注释处理。您是否创建了一个全局服务,在一个方法中使用Transactional

调用所有子服务
    SampleServiceImpl:

    @Transactional
    public void save(Sample sample){

        sampleDao.save(sample);
    }

        ParcicipantServiceImpl
        @Transactional 
        public void save(Participant participant){

         participantDao.save(participant);
    }

// A solution could be that , but not very clean...there should be an another way, no?
        GlobalServiceImpl

        @Transactional 
        public void save(Participant participant,Sample sample){

         participantDao.save(participant);
                 sampleDao.save(sample);
    }

3-最后一个问题,但并非最不重要。如果您想在一个全局事务中使用来自多个服务的多个方法。想象一下,你想在一次执行独立程序时填满5个或更多表。怎么可能因为每个服务都有他正确的事务方法,所以每次调用这个方法时都会有一个事务。

a-我已成功使用Mkyong教程和映射中的级联属性来填充示例事务中的两个表。所以我看到如何使它适用于一个表直接连接到另一个或多个表。 b-但如果你有3个参与者 - >样品 - >衍生产品。如何在同一笔交易中填写三张表。

我不知道我是否清楚。但我会感谢高级用户提供的一些帮助或示例。 非常感谢你的时间。

2 个答案:

答案 0 :(得分:1)

  1. 您的解决方案很好,如果您想使用嵌套的事务方法,可能会有效(请注意我几天前看过这个解决方案并且没有测试过):

    < tx:注释驱动模式=“aspectj”/> < context:load-time-weaver aspectj-weaving =“on”/>

  2.     
        @Transactional
        public void action(Sample sample){
            save(sample);
            delete(sample);
        }
    
    1. 交易应该传播。
    2. GlobalServiceImpl

      @Transactional 
      public void save(Participant participant,Sample sample){
           participantDao.save(participant);
           sampleServiceImpl.save(sample); 
      }
      

答案 1 :(得分:0)

你关注的approch是更干净的approch,

ServiceOpjects包含业务逻辑。因此,他们将始终通过数据对象进行操作。 我们在实践中所做的是创建另一个使用dataObjects和同一层的其他函数调用的层。然后通过具有注释@transactional的服务层调用所有业务层。

你能否提一下为什么你觉得这个approch很脏?