在服务类中使用多个dao完成事务

时间:2013-08-15 08:39:07

标签: java spring hibernate jpa dao

如何实现服务类需要多个数据访问对象的完整事务。假设我有以下结构。

目前,如果我的dao2失败,dao1仍然被提交到数据库,我不希望它发生。但是,我需要我的DAO可以重复使用。

public class mainService(){
  dao1.store(obj1);
  dao2.store(obj2);
}

我的dao是用这种方式写的。

Dao 1

private EntityManager entityManager;
@Transactional
public void store(Object obj1){
  entityManager.persist(obj1);
}

Dao 2

private EntityManager entityManager;
@Transactional
public void store(Object obj2){
  entityManager.persist(obj2);
}

请帮忙。

3 个答案:

答案 0 :(得分:2)

在一次交易中实现这一点。

@Transactional
public void mainService(..){
  dao1.store(obj1);
  dao2.store(obj2);
}

只会创建一个事务,如果dao2失败,也不会提交dao1。并从@Transactional方法中删除store。使DB级方法具有事务性,这不是一个好主意。在某些情况下,这个水平可能会低两个。

答案 1 :(得分:0)

显而易见的答案是使用:

private EntityManager entityManager;
@Transactional
public void store(Object obj1, Object obj2){
    entityManager.persist(obj1);
    entityManager.persist(obj2);
}

发生的事情是你已经开始使用DAO了。 DAO死了!如果你看一下EntityManager API,你会发现它实际上看起来非常像DAO类型的接口。因此,只需在通常考虑使用DAO的地方直接使用它。

答案 2 :(得分:0)

在你的情况下,你应该用@Transactional标记mainService(),因为事务传播规则默认是PROPAGATION_REQUIRED,然后dao1.store()和dao2.store()都在同一个事务下。它没关系保持dao1.store()和dao2.store()@ Transaction,他们会意识到已经有了一个事务,然后加入了这个事务。