2010-11-11 26 views
9

@ Transactional olarak işaretlenmiş bir yöntemim var. Çeşitli işlevlerden oluşur, bunlardan biri JDBC ve ikincisi - Hazırda Beklet, üçüncü - JDBC. Sorun, Hazırda Beklet işlevi tarafından yapılan değişikliklerin, son işlevlerde JDBC ile birlikte görünmemesidir.Bir işlemde Hibernate ve JDBC

<bean id="myDataSource" class="org.springframework.jdbc.datasource.TransactionAwareDataSourceProxy"> 
     <property name="targetDataSource" ref="targetDataSource"/> 
    </bean> 

    <bean id="targetDataSource" class="org.apache.commons.dbcp.BasicDataSource" 
      destroy-method="close" lazy-init="true" scope="singleton"> 
     <!-- settings here --> 
    </bean> 

myDataSource fasulye kod kullanılır:

@Transactional 
void update() { 
    jdbcUpdate1(); 
    hibernateupdate1(); 
    jdbcUpdate2(); // results of hibernateupdate1() are not visible here  
} 

Tüm fonksiyonlar aynı veri kaynağı kullanmak üzere yapılandırılır. myDataSource.getConnection() JDBC işlevlerde bağlantıları ile çalışmak için kullanılan ve

getHibernateTemplate().execute(new HibernateCallback() { 
      public Object doInHibernate(Session session) throws HibernateException, SQLException { 
       ... 
      } 
     }); 

hazırda fonksiyonu kullanılır. Teşekkürler.

cevap

10

İlk önce, hazırda bekletme modunu kullanırken JDBC kullanmaktan kaçının.

Eğer gerçekten ihtiyacınız varsa, Session.doWork(..) kullanın. Hazırda bekletme sürümünüz henüz bu yönteme sahip değilse, session.connection()'dan Connection'u edinin.

+2

Google'dan buraya gelenler için, bu sorunla ilgili çözümüm. Hibernate flush işlevinin sonunda session.flush() ekledim. Bundan sonra, yazma sonucu sonraki jdbc okuma fonksiyonunda (aynı işlemde) mevcuttur. – alex543

2

Sen JDBC kullanmak ve doğru İlkbahar kurulumunu kullanırsanız aynı işlemde Hibernate edebilirsiniz:

<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory"/> 
</bean> 

<bean id="myDao" class="org.springframework.transaction.interceptor.TransactionProxyFactoryBean"> 
    <property name="transactionManager" ref="transactionManager"/> 
    <property name="target"> 
     <bean class="MyDaoImpl"> 
      <property name="dataSource" ref="dataSource"/> 
      <property name="sessionFactory" ref="sessionFactory"/> 
     </bean> 
    </property> 
    <property name="transactionAttributes"> 
     <props> 
      <prop key="get*">PROPAGATION_SUPPORTS,readOnly</prop> 
      <prop key="*">PROPAGATION_REQUIRED</prop> 
     </props> 
    </property> 
</bean> 

Bu DAO JDBC kısmı JdbcTemplate kullandığını düşünür. Bir bağlantısını

  • Wrap size DAO geçmek (şart olmamakla birlikte biri sizi DataSource almak için

    • Kullanım DataSourceUtils.getConnection (javax.sql.DataSource): Eğer birkaç seçenek yoksa bir TransactionAwareDataSourceProxy vekil veri kaynağı içinde DataSourceUtils.getConnection hidse yana ikincisi tercih edilir

    ile SessionFactory) geçer.

    Bu, XML yoludur, bunu açıklamalı ek açıklamaya dönüştürmek kolay olmalıdır.

  • 2

    Sorun, Hazırda çalışan motor üzerindeki işlemlerin, anında SQL yürütme sırasında sonucunu sağlamaz. Hazırda bekletme oturumunda el ile flush'u arayabilmeyi tetikleyebilirsiniz. Sonra hazırda bekletme yapılan değişiklikler, aynı işlem içindeki SQL koduyla görünür olacaktır. Eğer (1.Yıl seviye önbelleğe sahip olduğundan sürece ancak o zaman onları aynı işlem çalıştırmak gerekecek çünkü ... ters yönde

    SQL bağlantısı almak için DataSourceUtils.getConnection gibi, bu, daha karmaşıktır oturum önbellek) ve muhtemelen 2. seviye önbellek. İkinci düzey önbellek veritabanına yapılan tüm değişiklikler, önbellek süresi doluncaya kadar satır önbelleğe alınmışsa Hazırda bekletme için görünmez olacaktır.