【发布时间】:2017-12-24 23:46:03
【问题描述】:
我正在尝试学习如何使用 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”。遗憾的是,名称根本没有改变。如果我用throw new RuntimeException(); 替换TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); 并添加到注释rollbackFor=RuntimeException.class 结果是一样的。我已经阅读了一些关于传播的内容,但遗憾的是我不知道我的代码有什么问题。
我想到的一种可能性是我的驱动程序不支持保存点(在NESTED 中使用)但是当我将NESTED 更改为REQUIRES_NEW 时会发生同样的事情
【问题讨论】:
标签: java spring hibernate nested propagation