2017-02-17 8 views
1

@Transactionalで作成された既存のトランザクションを利用するネイティブクエリを作成できますか? ここでの質問のほとんどは、ネイティブクエリを作成することに関するものです。また、Spring + Hibernate Transaction -- Native SQL rollback failureのような回答は、それが可能でないかもしれないことを示唆している。Spring&Hibernate - @Transactionalと同じトランザクションでネイティブクエリを実行する

隔離をテストするには、いくつかの削除を実行し、データベースを調査するためのブレークポイントを追加します。ここで

は、私がこれまで試したものです:

@Transactional(value = "someManager") 
public class SpringJpaSomeDao implements SomeDao { 

@PersistenceContext(unitName = "someUnit") 
@Qualifier("entityManagerFactorySome") 
private EntityManager em; 


@Resource 
@Qualifier("someManager") 
private PlatformTransactionManager transactionManager; 

@Override 
@Transactional(value = "someManager", propagation = Propagation.SUPPORTS) 
public void runNative(String sql){ 
    TransactionTemplate transactionTemplate = new TransactionTemplate(transactionManager); 
    transactionTemplate.setPropagationBehavior(TransactionDefinition.PROPAGATION_SUPPORTS); 
    transactionTemplate.execute(new TransactionCallbackWithoutResult() { 

     @Override 

     protected void doInTransactionWithoutResult(TransactionStatus status) { 

      em.createNativeQuery(sql).executeUpdate(); 

     } 

    }); 





} 

にpersistence.xmlの一部

<persistence-unit name="someUnit" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <non-jta-data-source>java:comp/env/jdbc/someDS</non-jta-data-source> 
    <!-- some classes here --> 
    <exclude-unlisted-classes>true</exclude-unlisted-classes> 
    <properties> 
     <!-- some dialect --> 
    </properties> 
</persistence-unit> 

コードも削除を与える@Transactionalのアノテーションを持っているいくつかのコントローラから起動されますDao。ばねdao.xmlから

@Transactional(value = "someManager", propagation = Propagation.SUPPORTS) 
public void deleteEntireDatabase() { 

    List<String> deletions = new ArrayList<>(); 
    deletions.add("DELETE FROM something;"); 


    for (String currentDeletion : deletions) { 
     someDao.runNative(currentDeletion); 
    } 


} 

@Override 
@Transactional(value = "someManager", propagation = Propagation.REQUIRES_NEW, rollbackFor = {Exception.class}) 
public void deleteAndFill(JobExecutionProgress progress) { 
    deleteEntireDatabase(); 
    // more code 
} 

抜粋:もちろん

<tx:annotation-driven /> 

<bean id="entityManagerFactorySome" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="dataSource" ref="someDataSource" /> 
    <property name="persistenceUnitName" value="someUnit" /> 
    <property name="jpaProperties"> 
     <props> 
      <!-- some dialect --> 
     </props> 
    </property> 
</bean> 

<bean id="someDao" class="xyz.model.controller.SpringJpaSomeDao"/> 

<bean id="someManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactorySome" /> 
    <qualifier value="someManager"></qualifier> 
</bean> 


<bean class="org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor" /> 

、Iはまた、異なる伝播などのいくつかのバリエーションを試みたが、EntityManagerを使用して他の場所から得られる:

EntityManagerFactory emf = ((JpaTransactionManager) transactionManager).getEntityManagerFactory(); 

    EntityManager em2 = EntityManagerFactoryUtils.getTransactionalEntityManager(emf); 

さて、他のすべてが失敗した場合、私がやることは手動トランザクション管理です。

これはアプリケーションのいずれかで動作していたものですか、これがセットアップの問題であるかどうかは不明ですか?

+0

ところで、完全性のために、delete-Methodには、auto_incrementをリセットするためのalter table文も含まれていることに言及する必要があります。 –

答えて

0

実際には、コメントに記載されているalter table文が問題だったようです。 auto_incrementをリセットすることでどのようにテーブルを空にすることができるのかはっきりしていませんが、そのように思われます。

関連する問題