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?
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?) –
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ã –
@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. –