Ответы Берта и Кимбла сработают, но вы можете сделать это проще.Вам необходимо создать класс, который реализует класс Hibernate CurrentSessionContext, но нет необходимости создавать прокси для фабрики сеансов, поскольку вы можете переопределить поведение создания сеанса в классе контекста сеанса, а затем просто указать имя этого класса.в свойствах вашего сессионного фабричного компонента.например, напишите свой контекст сеанса следующим образом:
import org.hibernate.FlushMode;
import org.hibernate.classic.Session;
import org.hibernate.context.JTASessionContext;
import org.hibernate.engine.SessionFactoryImplementor;
public class MySessionContext extends JTASessionContext {
public MySessionContext(SessionFactoryImplementor factory) {
super(factory);
}
@Override
protected Session buildOrObtainSession() {
Session session = super.buildOrObtainSession();
// do stuff to the session here
return session;
}
}
Затем в свойствах, передаваемых классу фабрики сеансов, укажите это имя класса:
hibernate.current_session_context_class=org.company.MySessionContext
Например, в типичном сценарии Spring, вы можете использовать фабричный bean-компонент Spring для создания экземпляров своих свойств гибернации, например:
<bean id="hibernateProperties" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
<property name="properties">
<props>
<prop key="hibernate.current_session_context_class">org.company.MySessionContext</prop>
// your other Hibernate properties here
</props>
</property>
</bean>
Затем обычно вы создаете фабрику сессий с использованием bean-компонента фабрики Spring, например (имя пакета заметок будет отличатьсядля разных версий Hibernate):
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="configLocations" ref="hibernateConfigLocations"/>
<property name="hibernateProperties" ref="hibernateProperties"/>
<property name="entityInterceptor" ref="hibernateEntityInterceptor"/>
<property name="jtaTransactionManager" ref="transactionManager"/>
<property name="implicitNamingStrategy" ref="underscoresNamingStrategy"/>
</bean>
Hibernate включает в себя три различных класса контекста сеанса, поэтому просто переопределите тот, который вам нужен:
org.hibernate.context.JTASessionContext
org.hibernate.context.ThreadLocalSessionContext
org.hibernate.context.ManagedSessionContext
Все три имеют метод buildOrObtainSession иJavadoc для метода на самом деле говорит «предоставлен для целей подклассов».Контекст сеанса JTA потребуется, если вы используете транзакции, которые охватывают несколько ресурсов, таких как несколько баз данных, или базы данных и очереди JMS, если вы просто обращаетесь к одному ресурсу в каждой транзакции, то ThreadLocalSessionContext будет достаточно.