Spring Hibernate SessionFactory

#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.

http://static.springsource.org/spring/docs/3.1.0.RC1/javadoc-api/org/springframework/orm/hibernate4/LocalSessionFactoryBuilder.html

Это устраняет неудобную необходимость иметь дело с 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();
}