私は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
について少し読んで、このコードは(のiはID 7でユーザーのcompanyService.testNested(7,"newName")
変更名前を作ったと仮定しましょうだろうと思っていますし、私のコードがありますTransactionAspectSupport.currentTransactionStatus().setRollbackOnly();
をthrow new RuntimeException();
に置き換えて、注釈rollbackFor=RuntimeException.class
に追加すると、結果は同じです。伝播について少しは読んだことがありますが、悲しいことに私は何が間違っているのでしょうか?コード。 comの可能性私の心にESは私のドライバがセーブポイントをサポートしていません(NESTED
で使用されている)が、同じことが、私は問題がトランザクションではないと思うNESTED
そうだった。今私は "JpaDialectはセーブポイントをサポートしていない - あなたのJPAプロバイダーの能力をチェックする"が得られますが、リストではそれが機能します:)。 – ogarogar
それを動作させるにはどんな考えですか? (Requires_NEWは問題ありません)。 – ogarogar
"ネスト"を使って達成しようとしていることは何ですか? 「必要」はあなたが望むものを達成するでしょうか? – JustinKSU