Spring @Transactional注释不起作用

时间:2015-08-22 13:24:26

标签: 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);
    }

2 个答案:

答案 0 :(得分:7)

因为它用于私有方法。 Spring Docs

  

方法可见性和@Transactional

     

使用代理时,应该应用@Transactional注释   仅限具有公众可见度的方法。如果你做注释保护,   使用@Transactional注释的私有或包可见方法,   没有引发错误,但带注释的方法没有出现错误   配置的事务设置。考虑使用AspectJ(参见   如果你需要注释非公开方法。

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

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

答案 1 :(得分:0)

luboskrnac实际上确实为我回答了这个问题,但是只是将其添加到可能对是否使用代理感到困惑的Spring新手。

请参考此页面,说明即使您在同一类中调用@Transactional方法,但由于您在不使用同一类的情况下调用它的情况下,也不会通过代理对其进行调用的情况。

https://www.logicbig.com/tutorials/spring-framework/spring-data-access-with-jdbc/correct-use-of-declarative-transaction.html