我正在尝试在以下方法中运行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);
}
答案 0 :(得分:7)
因为它用于私有方法。 Spring Docs:
方法可见性和@Transactional
使用代理时,应该应用@Transactional注释 仅限具有公众可见度的方法。如果你做注释保护, 使用@Transactional注释的私有或包可见方法, 没有引发错误,但带注释的方法没有出现错误 配置的事务设置。考虑使用AspectJ(参见 如果你需要注释非公开方法。
当它是私有的时,它显然是在同一个类中调用的。但Spring调用需要通过代理才能使其正常工作。因此需要从另一个bean调用该方法。
其他选项是使用@Transactional注释类。
答案 1 :(得分:0)
luboskrnac实际上确实为我回答了这个问题,但是只是将其添加到可能对是否使用代理感到困惑的Spring新手。
请参考此页面,说明即使您在同一类中调用@Transactional方法,但由于您在不使用同一类的情况下调用它的情况下,也不会通过代理对其进行调用的情况。