2010-11-11 47 views
9

Tôi có một phương thức, được đánh dấu là @Transactional. Nó bao gồm một số chức năng, một trong số chúng sử dụng JDBC và hàm thứ hai - Hibernate, thứ ba - JDBC. Vấn đề là những thay đổi, được thực hiện bởi chức năng Hibernate không hiển thị trong các chức năng cuối cùng, hoạt động với JDBC.Hibernate và JDBC trong một giao dịch

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

Tất cả các chức năng được cấu hình để sử dụng nguồn dữ liệu giống nhau:

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

đậu myDataSource được sử dụng trong các mã. myDataSource.getConnection() được sử dụng để làm việc với các kết nối trong các hàm jdbc và

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

được sử dụng trong chức năng ngủ đông. Cảm ơn.

Trả lời

10

Trước tiên, tránh sử dụng JDBC khi sử dụng chế độ ngủ đông.

Sau đó, nếu bạn thực sự cần, hãy sử dụng Session.doWork(..). Nếu phiên bản ngủ đông của bạn chưa có phương pháp này, hãy lấy số Connection từ session.connection().

+2

Đối với những người, những người sẽ đến đây từ Google, giải pháp của tôi cho vấn đề này. Tôi đã thêm session.flush() vào cuối hàm flush hibernate. Sau đó, kết quả ghi của nó có sẵn trong hàm jdbc read tiếp theo (trong cùng một giao dịch). – alex543

2

Bạn có thể sử dụng JDBC và Hibernate trong cùng một giao dịch nếu bạn sử dụng các thiết lập mùa xuân phải:

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

này giả định rằng phần JDBC của DAO của bạn sử dụng JdbcTemplate. Nếu nó không bạn có một vài lựa chọn:

  • Sử dụng DataSourceUtils.getConnection (javax.sql.DataSource) để có được một kết nối
  • Bó DataSource bạn vượt qua để DAO của bạn (nhưng không nhất thiết phải là một trong những bạn chuyển đến SessionFactory) với một TransactionAwareDataSourceProxy

Cách thứ hai được ưu tiên vì nó ẩn dữ liệu trong nguồn dữ liệu proxy.

Đây tất nhiên là đường dẫn XML, nên dễ dàng chuyển đổi điều này thành chú thích dựa trên.

2

Vấn đề là, các thao tác trên công cụ Hibernate không cho kết quả là khi thực thi SQL ngay lập tức. Bạn có thể kích hoạt nó theo cách thủ công gọi flush trên phiên Hibernate. Sau đó, các thay đổi được thực hiện trong chế độ ngủ đông sẽ được hiển thị cho mã SQL trong cùng một giao dịch. Miễn là bạn làm DataSourceUtils.getConnection để có được kết nối SQL, bởi vì chỉ sau đó bạn sẽ có chúng chạy trong cùng một giao dịch ...

Theo hướng ngược lại, điều này phức tạp hơn, bởi vì bạn có bộ nhớ cache cấp 1 (bộ nhớ cache phiên) và cũng có thể là bộ nhớ cache cấp 2. Với bộ nhớ cache mức 2 tất cả các thay đổi được thực hiện cho cơ sở dữ liệu sẽ được ẩn với Hibernate, nếu hàng được lưu trữ, cho đến khi bộ nhớ cache hết hạn.

Các vấn đề liên quan