Spring @Transactional注释不起作用

ezt*_*tam 2 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
    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);
    }
Run Code Online (Sandbox Code Playgroud)

lub*_*nac 8

因为它用于私有方法.Spring Docs:

方法可见性和@Transactional

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

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

其他选项是使用@Transactional注释类.

  • 即使它是公共的,如果它是从同一个类的另一个方法调用的,它也不会使用代理,@ Transnsal也会被忽略 (2认同)
  • 公开该方法首先并没有解决我的问题。但是另外将 @Transactional 注释添加到其他方法中,该方法不是从同一个类调用的,最终解决了我的问题。现在我正在考虑使用aspectj (2认同)