Кажется, что порядок вызова метода destory для bean-объектов не-синглтонной области полностью вышел из-под контроля. Из документов ( 5.1.4 Использование зависит от ):
Атрибут зависимый в определении компонента может указывать как время инициализации
Зависимость и, только в случае синглтон-компонентов , соответствующее время уничтожения
зависимость
Вы можете создать вспомогательный объект и поручить ему создание и уничтожение ваших bean-компонентов:
public class HelperObject
{
private SessionFactory factory;
private Session session;
private Transaction tx;
public void init()
{
session = factory.createSession();
tx = session.beginTransaction();
}
public void destroy()
{
tx.commit();
session.close();
}
...
}
-
<bean id = "helperObject" class = "HelperObject" scope = "request" init-method = "init" destroy-method = "destroy">
<property name = "factory" ref = "hibernateSessionFactory" />
</bean>
<bean id="hibernateSession" factory-bean="helperObject"
factory-method="getSession" scope="request" />
<bean id="hibernateTransaction" factory-bean="helperObject"
factory-method="getTransaction" scope="request" />
И, в конце концов, возможно, это не лучший способ управления сеансами и транзакциями Hibernate в Spring. Рассмотрите возможность использования встроенной поддержки Spring Hibernate и .
EDIT:
Ну, правильный способ управления транзакциями это :
- Вам не нужны параметры запроса
session
и transaction
бобов
- Вы не должны вызывать
createSession
на фабрике сеансов, возвращенной org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean
. Вы можете добавить эту фабрику сессий в свои bean-компоненты и вызывать getCurrentSession
, когда вам нужен сеанс, a он будет работать нормально.
- Вы можете использовать декларативное управление транзакциями (
@Transactional
аннотации для транзакционных методов). Чтобы это работало, вы должны добавить в свой конфиг:
.
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="hibernateSessionFactory"/>
</bean>
<tx:annotation-driven/>
- Для получения дополнительной информации см. Ссылки выше