当前位置: 首页 > 面试题库 >

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

微生慈
2023-03-14
问题内容

在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。在这里我做错了什么?谢谢。


问题答案:

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



 类似资料:
  • 问题内容: 我在Service类中看到了一种被标记为的方法,但是它也在同一类中调用了其他未标为的方法。 这是否意味着对单独方法的调用导致应用程序打开与DB的单独连接或暂停父事务等? 不带任何注释的方法的默认行为是什么,而另一个带有注释的方法调用该方法的默认行为是什么? 问题答案: 当你调用没有事务块之内的方法时,父事务将继续使用新方法。它将使用与父方法(with )相同的连接,以及在调用的方法中导

  • 问题内容: 有没有简单的解决方案,可以在新线程中使用JPA将数据保存到数据库中? 我基于Spring的Web应用程序允许用户管理计划的任务。在运行时,他可以创建和启动预定义任务的新实例。我正在使用spring的TaskScheduler,并且一切正常。 但是我需要将每个被激发任务的布尔结果保存到数据库中。我怎样才能做到这一点? 编辑:我必须概括我的问题:我需要从任务在我的@Service类上调用方

  • 我有一个层,称为,另一个称为。我想知道我是否可以强制执行一条规则,上面写着: 在参数列表包含名为foo的参数的服务层中的任何公共类的任何公共方法中,断言它从权限层调用方法(理想情况下,确保在服务层中的任何其他方法之前调用该方法)。 ArchUnit可以这样做吗?

  • 问题内容: 我有 但后来当我打电话从通过运行以下命令在命令行上,JAVA抱怨说,你不能调用从静态功能的方法。 所以我的问题是:如何从主方法调用方法,如果不可能,使用java命令从命令行运行程序后,有哪些替代策略可以调用方法。 问题答案: 您只能针对类的实例调用类似的实例方法(顺便说一下,这是一个非法的方法名称): 另外,如果对您的设计有效,则也使它成为静态。

  • 我创建了两个类:和。下面是进行计算的方法: 这里是一个调用并显示结果的函数,不幸的是,我无法根据这本书要求它运行的方式来运行它。 任何提示都会帮助我在我的再教育过程中。