#hibernate #spring #sessionfactory
#переход в спящий режим #spring #sessionfactory
Вопрос:
Как создать SessionFactory, используя конфигурацию java?
@Bean
public SessionFactory sessionFactory(){
AnnotationSessionFactoryBean sessionFactoryBean = new AnnotationSessionFactoryBean();
sessionFactoryBean.setConfigLocation(new ClassPathResource("hibernate.cfg.xml"));
return sessionFactoryBean.getObject();
}
Это не работает для некоторых reason…it всегда возвращает значение null.
Ответ №1:
Вместо этого верните factory:
@Bean
public AbstractSessionFactoryBean sessionFactoryBean(){
AnnotationSessionFactoryBean sessionFactoryBean = new AnnotationSessionFactoryBean();
sessionFactoryBean.setConfigLocation(new ClassPathResource("hibernate.cfg.xml"));
return sessionFactoryBean;
}
Если вам нужно внедрить SessionFactory
непосредственно где-нибудь в коде, добавьте этот вспомогательный метод:
public SessionFactory sessionFactory() {
return sessionFactoryBean().getObject();
}
Обратите внимание, что помощник sessionFactory()
не снабжен аннотациями @Bean
— это действительно важно.
Комментарии:
1. Это сработало для меня, но я был смущен, куда нужно было поместить компонент. Для других, если у вас есть класс, который содержит аннотацию с помощью ‘@Configuration’, я бы поместил туда метод ‘@Bean’. Загрузился без проблем, и я был готов к работе.
2. AbstractSessionFactoryBean устарел
Ответ №2:
Томаш прав, но я действительно считаю, что создание экземпляра объекта с использованием «new» не соответствует концепции Spring:
Я думаю, вам нужно сделать это таким образом:
<bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
<property name="dataSource" ref="dataSource"/>
<property name="hibernateProperties">
<props>
<prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.hbm2ddl.auto">update</prop>
<prop key="hibernate.show_sql">true</prop>
</props>
</property>
<property name="annotatedClasses">
<list>
<value>com.vanilla.objects.Student</value>
<value>com.vanilla.objects.Address</value>
</list>
</property>
</bean>
<bean id="transactionManager"
class="org.springframework.orm.hibernate3.HibernateTransactionManager">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
и затем вы можете использовать его внутри вашего Spring bean:
@Autowired
SessionFactory sessionFactory;
а затем внутри вашего метода:
Session session = sessionFactory.getCurrentSession();
Комментарии:
1. Он использует конфигурацию контейнера на основе Java , которая является новой функцией Spring 3.0.x. Код операционной системы полностью исправен и идиоматичен (за исключением проблемы, с которой он сталкивается, конечно).
Ответ №3:
Здесь стоит отметить, что в Spring 3.1 представлен LocalSessionFactoryBuilder, который специально разработан для использования в методах @Bean.
Это устраняет неудобную необходимость иметь дело с FactoryBeans, методами GetObject () и т.д. FactoryBeans превосходны для использования в XML, но не идеальны в методах @Bean.
Обратите внимание, что этот новый конструктор доступен только для Hibernate 4.1 .
Ответ №4:
Поскольку приведенные выше ответы устарели, вот более современный подход:
@Bean
public SessionFactory sessionFactory(HibernateEntityManagerFactory hemf){
return hemf.getSessionFactory();
}
Кроме того, если вы ввели EntityManager
, вы можете получить текущий сеанс через
Session session = entityManager.unwrap(Session.class);
Ответ №5:
Вы должны вызвать afterPropertiesSet() на фабрике сеансов после настройки всех свойств
Итак, в вашем примере это будет выглядеть так:
@Bean
public SessionFactory sessionFactory(){
AnnotationSessionFactoryBean sessionFactoryBean = new AnnotationSessionFactoryBean();
sessionFactoryBean.setConfigLocation(new ClassPathResource("hibernate.cfg.xml"));
sessionFactoryBean.afterPropertiesSet();
return sessionFactoryBean.getObject();
}