2013-11-09 15 views
6

Tôi có một ứng dụng với Spring và Hibernate3 chạy tốt trong sản xuất. Sau đây là cấu hình cho nhà máy phiên trong Spring's applicationContext.xmlsử dụng thuộc tính current_session_context_class hibernate 3 hibernate 4

 <bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="mappingDirectoryLocations"> 
     <list> 
      <value>classpath:/hibernate</value> 
     </list> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect 
      </prop> 
      <prop key="hibernate.show_sql">true</prop> 
      <prop key="hibernate.format_sql">true</prop> 
      <prop key="hibernate.use_sql_comments">true</prop> 
      <prop key="hibernate.max_fetch_depth">2</prop> 
      <prop key="hibernate.autocommit">false</prop> 
      <prop key="hibernate.current_session_context_class ">thread</prop> 
          <prop key="hibernate.generate_statistics">true</prop> 
      <prop key="hibernate.jdbc.batch_size">20</prop> 
     </props> 
    </property> 
</bean> 

<bean id="txManager" 
    class="org.springframework.orm.hibernate3.HibernateTransactionManager"> 
    <property name="sessionFactory" ref="sessionFactory" /> 
</bean> 
<!-- the transactional advice (what 'happens'; see the <aop:advisor/> bean 
    below) --> 
<tx:advice id="txAdvice" transaction-manager="txManager"> 
    <!-- the transactional semantics... --> 
    <tx:attributes> 
     <tx:method name="*" propagation="REQUIRED" /> 
     <tx:method name="get*" propagation="SUPPORTS" read-only="true" /> 
     <tx:method name="count*" propagation="SUPPORTS" read-only="true" /> 
     <tx:method name="validate*" propagation="SUPPORTS" 
      read-only="true" /> 
     <tx:method name="find*" propagation="SUPPORTS" read-only="true" /> 
     <tx:method name="login" propagation="SUPPORTS" read-only="true" /> 
    </tx:attributes> 
</tx:advice> 

<!-- ensure that the above transactional advice runs for any execution of 
    an operation defined by the service interfaces --> 
<aop:config> 
    <aop:pointcut id="projectServiceOperation" 
     expression="execution(* com.service.project.IProjectService.*(..))" /> 
    <aop:advisor advice-ref="txAdvice" pointcut-ref="projectServiceOperation" /> 
</aop:config> 

Nó hoạt động tốt trong sản xuất.

Bây giờ cho một dự án khác, chúng tôi đang di chuyển sang Hibernate4. chúng tôi đã sao chép trên cùng một cấu hình ngoại trừ việc sử dụng SessionFactory của Hierrnate 4, TransacionManager, vv từ gói org.springframework.orm.hibernate4. *. Tuy nhiên nó bắt đầu đưa ra ngoại lệ nói "Lưu không hợp lệ mà không có giao dịch hoạt động". Sau khi tìm kiếm rất nhiều người dường như đã gặp phải sự cố và một số người đề xuất không sử dụng

 <prop key="hibernate.current_session_context_class ">thread</prop> 

tài sản và hoạt động. Nó cũng làm việc cho tôi. Tất cả các thông tin nhỏ tôi có thể thu thập từ các bài viết rằng nó có một cái gì đó để làm với các phiên theo ngữ cảnh và chiến lược thread can thiệp vào chiến lược quản lý phiên của Spring. Nhưng không có nơi nào tôi có thể tìm thấy bất kỳ câu trả lời cụ thể nào. Ngoài ra, tại sao nó làm việc với Hibernate3 và không phải với Hibernate4. Sự khác biệt và những gì đã thay đổi? Mọi cấu hình khác đều giống nhau. Tôi không sử dụng @Transactional nhưng cách học cũ của XML.

Can somebody point me to clear explaination for this behavioural difference in Hibernate3 and Hibernate4? 

Trả lời

6

Nó phụ thuộc vào phiên bản của mùa xuân nhưng nói chung lộn xộn với tài sản đó trong khi sử dụng Spring phải tránh (trừ khi bạn sử dụng JTA cho giao dịch thì bạn cần phải cấu hình này).

Kể từ Hibernate 3.1, có một số thứ được gọi là phiên theo ngữ cảnh và cho chế độ ngủ đông cung cấp giao diện CurrentSessionContext. Có một số triển khai cho việc này (và thread là viết tắt của ThreadLocalSessionContext). Spring đã thực hiện riêng giao diện này với lớp SpringSessionContext.

Mùa xuân theo mặc định đặt thuộc tính để thực hiện Springs CurrentSessionContext, khi điều này được đặt thành thứ khác (khác JTA) điều này sẽ phá vỡ khả năng lò xo để quản lý phiên ngủ đông (và do đó giao dịch).

Bây giờ trong các phiên bản cũ của mùa xuân (và tôi giả sử bạn cũng nâng cấp Spring để có thể sử dụng ngủ đông) kết hợp với hibernate 3 có một số mẹo khác liên quan đến việc nhận phiên (do khả năng tương thích ngược với các phiên bản cũ hơn. của hibernate). Điều này làm cho Spring bớt phụ thuộc vào giá trị của tài sản đó. (Spring đã tạo một proxy cho SessionFactory và về cơ bản đã chặn phương thức getSession để có thể quản lý phiên).

+0

Có tôi đã nâng cấp Spring từ 2,5 lên 3,2,4. Tôi đoán câu trả lời của bạn sufficinelty giải thích sự khác biệt hành vi trong các phiên xử lý vào mùa xuân. Và nó liên quan nhiều đến Spring hơn Hibernate phải không? (Hoặc cả hai?) –

+0

Tuy nhiên, bạn có thể vui lòng giải thích chi tiết về phiên theo ngữ cảnh và tại sao chúng được giới thiệu. Nếu bạn có một số liên kết hữu ích khác với tài liệu hibernate giải thích toàn bộ phiên xử lý bởi hibernate và ở đâu và như thế nào mùa xuân hiện các trick của việc xử lý những điều này tôi sẽ rất có nghĩa vụ. Hiện tại tôi cần phải rõ ràng hơn về lý thuyết trước khi đào sâu vào mã –

+0

@ShaileshVaishampayan Sự khác biệt giữa Spring 2.5 và 3.2 có thể được giải thích bởi phiên bản ngủ đông tối thiểu (3.2 yêu cầu hibernate 3.2 cho phép tích hợp sạch hơn). http://stackoverflow.com/questions/7871386/what-is-contextual-sessions-in-hibernate có thêm một số thông tin về các phiên theo ngữ cảnh.Nhưng trong ngắn hạn trước khi các phiên theo ngữ cảnh cần thiết để theo dõi phiên hiện tại (lưu trữ phiên trong một biến mẫu). Bây giờ được ủy nhiệm để ngủ đông, và làm cho nó dễ dàng hơn cho các khuôn khổ như hibernate. –

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