[英]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 方法的情况,由于您在没有同一个类的情况下调用它,因此不会通过代理调用它。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.