Mam aplikację internetową z ustawieniem Spring, aby utworzyć moją fabrykę sesji hibernacji (singleton) oraz sesję i transakcję (obie są objęte zakresem żądania), ale to niszczy sesję i transakcji w złej kolejności. Jak mogę to skonfigurować, aby transakcja została zniszczona przed sesją? Oto moja wiosna applicationContext.xml file:Próba zniszczenia fasoli w prawidłowej kolejności przy użyciu Spring
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-2.0.dtd">
<beans>
<bean id="hibernateSessionFactory" scope="singleton"
class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="configLocation" value="classpath:hibernate.cfg.xml" />
</bean>
<!-- The per-http request hibernate session -->
<bean id="hibernateSession" factory-bean="hibernateSessionFactory"
factory-method="openSession" destroy-method="close" scope="request" />
<!-- The per-http request transaction (i need this to be destroyed BEFORE the session) -->
<bean id="hibernateTransaction" factory-bean="hibernateSession"
factory-method="beginTransaction" destroy-method="commit" scope="request" />
</beans>
A oto log, który pokazuje to zamknięcie sesji przed zamknięciem transakcji:
16111 [http-8080-3] DEBUG org.springframework.beans.factory.support.DisposableBeanAdapter - Invoking destroy method 'close' on bean with name 'hibernateSession'
16111 [http-8080-3] DEBUG org.hibernate.jdbc.ConnectionManager - releasing JDBC connection [ (open PreparedStatements: 0, globally: 0) (open ResultSets: 0, globally: 0)]
16111 [http-8080-3] DEBUG com.mchange.v2.resourcepool.BasicResourcePool - trace [email protected] [managed: 4, unused: 3, excluded: 0] (e.g. [email protected])
16111 [http-8080-3] DEBUG org.springframework.beans.factory.support.DisposableBeanAdapter - Invoking destroy method 'commit' on bean with name 'hibernateTransaction'
16111 [http-8080-3] DEBUG org.hibernate.transaction.JDBCTransaction - commit
16111 [http-8080-3] WARN org.springframework.beans.factory.support.DisposableBeanAdapter - Invocation of destroy method 'commit' failed on bean with name 'hibernateTransaction'
org.hibernate.SessionException: Session is closed
Witam, Podejrzewałem, że wiosna ma wbudowane opcje zarządzania sesją/txn, jednak po przeczytaniu tych dwóch linków nadal nie jestem bliżej zrozumienia, jak one działają. Myślę, że wybiorę opcję "klasy pomocniczej", to świetny pomysł. Myślę, że szkoda, że wiosna nie może kontrolować porządku niszczenia, to naprawdę nie robi dla mnie tak wiele. – Chris
Spojrzałem na te 2 linki i nie widziałem, jak mogłem skorzystać z wiosennego menedżera transakcji (lub cokolwiek innego), aby dać mi sesję i transakcję, którą mógłbym wstrzyknąć w moje działania, wydawało mi się, że tylko sesja fabryka, którą mógłbym wtedy nazwać 'getCurrentSession()', co dla mnie nie wygląda ładnie. – Chris
Zgaduję, o co pytam, jeśli to nie jest najlepszy sposób, jaki * jest * najlepszy sposób zarządzania sesjami/txns ze sprężyną? – Chris