Spring @Transactional注释不起作用


问题内容

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

我的方法不起作用

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);
    }

问题答案:

因为它是在私有方法上使用的。spring文件

方法可见性和@Transactional

使用代理时,应仅将@Transactional注释应用于具有公共可见性的方法。如果使用@Transactional注释对受保护的,私有的或程序包可见的方法进行注释,则不会引发任何错误,但是带注释的方法不会显示已配置的事务设置。如果需要注释非公共方法,请考虑使用AspectJ(请参见下文)。

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

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