一尘不染

从另一个方法调用的@Transactional方法未获得事务

hibernate

在Spring中,带有注释的方法
@Transactional将获得一个新的事务(如果还没有),但是我注意到,如果从非事务处理方法调用事务方法,则不会获得任何事务。这是代码。

@Component
public class FooDao {
    private EntityManager entityManager;

    @PersistenceContext
    protected void setEntityManager(EntityManager entityManager) {
        this.entityManager = entityManager;
    }

    @Transactional
    public Object save(Object bean) {
        return this.entityManager.merge(bean);
    }

    public Object saveWrap(Object bean) {
        return save(bean);
    }
}

@Component
public class FooService {
    private FooDao fooDao;

    public void save(Object bean) {
        this.fooDao.saveWrap(bean); // doesn't work.
        this.fooDao.save(bean); // works
    }
}

saveWrap()是一个常规方法,save()该方法调用是事务性的,但saveWrap()不会保留任何更改。

我正在使用Spring 3和Hibernate3。在这里我做错了什么?谢谢。


阅读 440

收藏
2020-06-20

共1个答案

一尘不染

这是Springs AOP的局限性之一。因为dao
bean实际上是在spring时创建的,所以它意味着它是代理,这意味着从同一个类中调用方法将不会调用通知(即事务)。其他切入点也是如此

2020-06-20