Java Spring@Transactional注释不起作用

Java Spring@Transactional注释不起作用,java,spring,hibernate,spring-mvc,spring-transactions,Java,Spring,Hibernate,Spring Mvc,Spring Transactions,我试图在下面的方法中运行entityManager.merge(myEntity),但似乎忽略了@Transactional注释。Hibernate配置似乎很好,因为我可以成功地从数据库获取数据,但无法写入数据库。我使用的是Spring版本3.2.3。为什么写db操作不起作用 我的方法无效 package com.reflections.importer.bls; ... @Service class BlsGovImporter { ... @Transactional

我试图在下面的方法中运行entityManager.merge(myEntity),但似乎忽略了@Transactional注释。Hibernate配置似乎很好,因为我可以成功地从数据库获取数据,但无法写入数据库。我使用的是Spring版本3.2.3。为什么写db操作不起作用

我的方法无效

package  com.reflections.importer.bls;
...

@Service
class BlsGovImporter {

...

    @Transactional
    private void importSeries(String externalId) {
        // This works. The dao is using EntityManager too
        Series series = seriesDao.findByExternalId(externalId);

        series.getValues().addAll(fetchNewValues());

        // This does not work and no exception is thrown 
        entityManager.merge(series);
    }

因为它用于私有方法:

方法可见性和@Transactional

使用代理时,应应用@Transactional注释 仅适用于具有公共可见性的方法。如果您确实注释了protected, 带有@Transactional注释的私有或包可见方法, 不会引发错误,但带注释的方法不会显示 已配置事务设置。考虑AspectJ的使用(参见 下面)如果需要注释非公共方法

当它是私有的时,它显然是从同一个类中调用的。但是Spring调用需要通过代理才能工作。因此,需要从另一个bean调用该方法


另一个选择是用@Transactional注释类。

luboskrnac实际上为我回答了这个问题,但只是把这个添加到Spring新手身上,他可能会对使用代理或不使用代理感到困惑

请参阅本页,说明即使在同一个类中调用@Transactional方法,由于在没有同一个类的情况下调用它,也不会通过代理调用它


您的类BlsGovImporter位于哪个包中?在“com.reflections”中?它位于包com.reflections.importer.blsEven中。如果它是公共的,如果它是从同一类的另一个方法调用的,它将不使用代理,并且@Transactional也将被忽略。使该方法公共首先并没有解决我的问题。但是,将@Transactional注释添加到另一个方法中(该方法不是从同一个类调用的),最终解决了我的问题。现在我正在考虑使用aspectj@SergeBallesta,你是对的,我更新了我的答案。同一个类中有几个选项可以使用@Transactional:1。将Spring配置为使用AspectJ而不是SpringAOP2。自动连接bean并通过注入的引用调用方法