我在学习如何使用Hibernate和Spring,并且遇到了一些问题。希望检查我自己的皮肤上Propagation.NESTED的工作原理。还有就是我的代码:Spring中的嵌套传播
@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
并认为该代码会(让我们假设我有ID 7取得用户的companyService.testNested(7,"newName")
变更名称如果我将TransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
替换为throw new RuntimeException();
并添加到注释rollbackFor=RuntimeException.class
结果是一样的我已经阅读了一些关于传播的信息,但是我很遗憾我不知道我的错误是什么代码。 com的一种可能性ES我想到的是,我的驱动程序不支持保存点(即在NESTED
使用),但同样的事情发生时,我改变NESTED
到REQUIRES_NEW
情况就是这样。现在我只得到“JpaDialect不支持保存点 - 检查你的JPA提供者的能力”,但是在列表中它工作:)。 – ogarogar
任何想法,使其工作? (Requires_NEW工作得很好)。 – ogarogar
你想通过完全使用“嵌套”完成什么? “需要”会完成你想要的吗? – JustinKSU