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注释类。