Spring Hibernate SessionFactory - PullRequest
       0

Spring Hibernate SessionFactory

4 голосов
/ 14 ноября 2011

Как создать SessionFactory, используя конфигурацию java?

@Bean
public SessionFactory sessionFactory(){
    AnnotationSessionFactoryBean sessionFactoryBean = new AnnotationSessionFactoryBean();
    sessionFactoryBean.setConfigLocation(new ClassPathResource("hibernate.cfg.xml"));
    return sessionFactoryBean.getObject();
}

По какой-то причине это не работает ... всегда возвращает ноль.

Ответы [ 5 ]

12 голосов
/ 14 ноября 2011

Возврат фабрики вместо:

@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 - это действительно важно.

5 голосов
/ 14 ноября 2011

Томаш прав, но я верю, что создание экземпляра объекта с использованием «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();
3 голосов
/ 14 ноября 2011

Стоит отметить, что 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+.

2 голосов
/ 17 февраля 2017

Поскольку приведенные выше ответы устарели, вот более современный подход:

@Bean
public SessionFactory sessionFactory(HibernateEntityManagerFactory hemf){
    return hemf.getSessionFactory();
}

Кроме того, если вы ввели EntityManager, вы можете получить текущий сеанс через

Session session = entityManager.unwrap(Session.class);
1 голос
/ 30 января 2013

Вы должны вызвать afterPropertiesSet () на фабрике сеанса после установки всех свойств

Итак, в вашем примере это будет выглядеть так:

@Bean
public SessionFactory sessionFactory(){
    AnnotationSessionFactoryBean sessionFactoryBean = new AnnotationSessionFactoryBean();
    sessionFactoryBean.setConfigLocation(new ClassPathResource("hibernate.cfg.xml"));
    sessionFactoryBean.afterPropertiesSet();
    return sessionFactoryBean.getObject();
}
...