繁体   English   中英

Spring @Transactional 注释不起作用

[英]Spring @Transactional annotation is not working

我正在尝试在以下方法中运行 entityManager.merge(myEntity) 但似乎忽略了 @Transactional 注释。 Hibernate 配置似乎很好,因为我可以成功地从数据库中获取数据,但无法写入数据库。 我正在使用 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);
    }

因为它用于私有方法。 春季文档

方法可见性和@Transactional

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

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

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

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

请参阅此页面解释即使您在同一个类中调用@Transactional 方法的情况,由于您在没有同一个类的情况下调用它,因此不会通过代理调用它。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM