2017-07-19 13 views
0

私は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

答えて

0

REQUIRES_NEWに変更したときに起こるということです、それはの場合もあります分離されたエンティティ。値を変更した後、entityManager.save()またはentityManager.merge()メソッドを呼び出してみてください。

2

問題は同じクラスの中でメソッドを呼び出すことです。 Springはコールを傍受して@Transactionalの属性を適用する機会がありません。別のクラスに移動すると、探している動作が表示されます。

+0

そうだった。今私は "JpaDialectはセーブポイントをサポートしていない - あなたのJPAプロバイダーの能力をチェックする"が得られますが、リストではそれが機能します:)。 – ogarogar

+0

それを動作させるにはどんな考えですか? (Requires_NEWは問題ありません)。 – ogarogar

+0

"ネスト"を使って達成しようとしていることは何ですか? 「必要」はあなたが望むものを達成するでしょうか? – JustinKSU