我正在尝试学习如何使用 Hibernate 和 Spring 并遇到了一些问题。想检查我自己的皮肤 Propagation.NESTED 是如何工作的。这是我的代码:
@Component
@Transactional
public class CompanyServiceImpl implements CompanyService {
@Autowired
private CompanyDao dao;
...
@Override
public void testNested(int id,String name) {
User user=dao.getUser(id);
user.setName(name);
notValidNested(id,name+"new");
}
@Override
@Transactional(propagation=Propagation.NESTED)
public void notValidNested(int id,String name) {
dao.getUser(id).setName(name);
TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
}
}
@Component
public class CompanyDaoImpl implements CompanyDao {
@PersistenceContext
private EntityManager em;
...
@Override
public User getUser(int id) {
return em.find(User.class, id);
}
}
以及Spring的配置
@Configuration
@ComponentScan(basePackages= {"util.spring.test","service","dao"})
@EnableAspectJAutoProxy
@EnableTransactionManagement
public class SpringConfiguration {
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
System.out.println("entityManagerFactory - initialization started");
LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
entityManagerFactoryBean.setPersistenceUnitName("ORM");
entityManagerFactoryBean.getJpaPropertyMap().put(BeanValidationIntegrator.MODE_PROPERTY, ValidationMode.NONE);
return entityManagerFactoryBean;
}
@Bean
public PlatformTransactionManager transactionManager() {
System.out.println("transactionManager - initialization started");
JpaTransactionManager transactionManager = new JpaTransactionManager(entityManagerFactory().getObject());
transactionManager.setRollbackOnCommitFailure(true);
return transactionManager;
}
}
我读过一些关于 NESTED
的内容,并认为这段代码会(假设我让 companyService.testNested(7,"newName")
更改了用户的名称id 7 为“newName”。遗憾的是名称根本没有改变。如果我将 TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
替换为 throw new RuntimeException();
> 并添加到注释 rollbackFor=RuntimeException.class
结果是相同的。我已经阅读了一些有关传播的内容,但遗憾的是我不知道我的代码有什么问题。
我想到的一种可能性是我的驱动程序不支持保存点(在 NESTED
中使用),但当我将 NESTED
更改为 时,也会发生同样的情况REQUIRES_NEW
最佳答案
问题是您正在调用同一个类中的方法。 Spring 没有机会拦截调用并应用 @Transactional
属性。如果您将其移至单独的类,您应该会看到您正在寻找的行为。
关于java - Spring 中的嵌套传播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45195050/