1

我是 hibernate 4 和 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 个或更多表。怎么可能,因为每个Service都有自己合适的事务方法,所以每次调用这个方法,就有一个事务。

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

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

4

2 回答 2

1
  1. 您的解决方案很好,如果您想使用嵌套事务方法,也许这可行(注意我几天前看到了这个解决方案并没有测试它):

    <tx:annotation-driven mode="aspectj" /> < context:load-time-weaver aspectj-weaving="on"/>

    
    @Transactional
    公共无效操作(示例样本){
        保存(样本);
        删除(样本);
    }
  1. 交易应该传播。

全球服务实施

@Transactional 
public void save(Participant participant,Sample sample){
     participantDao.save(participant);
     sampleServiceImpl.save(sample); 
}
于 2013-07-25T08:50:29.350 回答
0

您遵循的方法是更清洁的方法,

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

你能说说为什么你认为这个方法很脏吗?

于 2013-07-25T08:51:10.110 回答