【问题标题】:Spring Hibernate SessionFactorySpring Hibernate SessionFactory
【发布时间】:2011-12-28 14:50:59
【问题描述】:

如何使用 java 配置创建 SessionFactory?

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

由于某种原因这不起作用...它总是返回 null。

【问题讨论】:

    标签: hibernate spring sessionfactory


    【解决方案1】:

    由于上述答案已经过时,这里有一个更现代的方法:

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

    另外,如果你注入了EntityManager,你可以通过

    Session session = entityManager.unwrap(Session.class);
    

    【讨论】:

      【解决方案2】:

      你应该在设置完所有属性后调用会话工厂的 afterPropertiesSet()

      所以在你的例子中它看起来像:

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

      【讨论】:

        【解决方案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】:

          Tomasz 是对的,但我相信使用“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();
          

          【讨论】:

          • 他使用的是Java-based container configuration,这是Spring 3.0.x的新特性。 OP 的代码完全没问题,而且非常地道(当然,除了他面临的问题)。
          【解决方案5】:

          改为返回工厂:

          @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 注释 - 这非常重要。

          【讨论】:

          • 这对我有用,但我很困惑 bean 需要放在哪里。对于其他人,如果您有一个包含带有“@Configuration”注释的类,我会将“@Bean”方法放在那里。加载没问题,我很高兴。
          • AbstractSessionFactoryBean 已弃用
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-05-06
          • 2012-06-10
          • 2015-12-31
          • 2018-03-22
          • 2014-09-23
          • 2015-06-10
          • 1970-01-01
          相关资源
          最近更新 更多