Hibernate 4 + Spring 3.2 + Transaction:一个服务,几个道,一个方法

Posted

技术标签:

【中文标题】Hibernate 4 + Spring 3.2 + Transaction:一个服务,几个道,一个方法【英文标题】:Hibernate 4 + Spring 3.2 + Transaction : One Service, Several Dao , One Method 【发布时间】:2013-07-25 01:06:16 【问题描述】:

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

我们来了! 因此,您每次都创建一个 Pojo、一个 Dao、一个 Service 类,并使用带注释的方法进行事务处理。没关系。我正在使用 Sessionfactory 来处理我的事务。我正在寻找好的做法。

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

这个 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 注解处理。你创建一个全局服务调用所有子服务在一个方法注释为事务

    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 个表参与者 -> 样本 -> 衍生产品。您将如何在同一个事务中填写三个表。

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

【问题讨论】:

【参考方案1】:

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

@Transactional 公共无效操作(示例样本) 保存(样本); 删除(样本);
    事务应该传播。

GlobalServiceImpl

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

【讨论】:

【参考方案2】:

您关注的方法是更清洁的方法,

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

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

【讨论】:

我不喜欢你用一系列动作(删除、保存、更新、选择...)来制作方法的想法。我想有一种方法可以将唯一方法分开保存/删除/更新/选择/其他,并按照我在全局事务中想要的顺序在我的主类中组织它们。我不想每次都使用顺序操作来实现一个方法。因为事实上,您必须在调用子服务的 parentService 中编写一个方法。 ParentService 没有任何意义,只是方便你处理事务。我认为您可以直接在主体中执行此操作而无需创建全局服务 可能取决于需要。例如,当在我们的产品中创建用户时,我们需要在 14 个表中插入并从 1 个表中删除......他们没有其他方法...... 而且我们总是想调用它 addUser 以便它具有相同的业务意义

以上是关于Hibernate 4 + Spring 3.2 + Transaction:一个服务,几个道,一个方法的主要内容,如果未能解决你的问题,请参考以下文章

事务不适用于 Spring 3.1 – H2 – junit 4 – hibernate 3.2

通用后台管理系统(ExtJS 4.2 + Spring MVC 3.2 + Hibernate)

基于SpringMVC4.3.2+Spring4.3.2+MyBatis3.4.1搭建SSM框架

带有 Hibernate 4.3.6 的 HSQLDB 2.3.2 中的语法错误

搭建SpringMVC+Spring4.3.2+Hibernate5.2.2框架

基于struts2.5.2+hibernate5.2.2+spring4.3.2搭建SSH框架