2016-03-10 184 views
3

我知道如何使用Hibernate来配置Spring。Spring如何与Hibernate集成

但我的问题是如何整合春季和休眠以及它是如何工作的。

下面是我用来创建Spring + Hibernate应用程序的代码。

<bean id="sessionFactory" 
    class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean"> 
    <property name="dataSource"> 
     <ref bean="dataSource" /> 
    </property> 
    <property name="hibernateProperties"> 
     <props> 
      <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop> 
      <prop key="hibernate.show_sql">false</prop> 
     </props> 
    </property> 
</bean> 

这SessionFactory的bean是在Java代码注入,

import org.hibernate.SessionFactory; 
public class DAOSupport extends HibernateDaoSupport { 

@Autowired 
public void createSessionFactory(SessionFactory sessionFactory) { 
    setSessionFactory(sessionFactory); 
} 

正如你可以看到,我用与弹簧组件相关的创建会话工厂,但在代码中是使用Hibernate包。

PS:我知道HibernateDaoSupport已被弃用,这只是为了解这两个框架是如何工作的。

感谢Gimby的链接。 JavaDoc

+0

有一个区别,Spring类是一个工厂,它创建了Hibernate类的实例。 – Tobb

+0

Spring被用作IoC,它在Hibernate中注入SessionFactory,如你所示,有一个由Spring上下文创建的sessionFactory,而不是你自己。 – mlewandowski

+0

@mlewandowski:但那个sessionFactory属于spring包。 – Lathy

回答

2

Spring的AnnotationSessionFactoryBean(以及LocalSessionFactoryBean)实现了称为FactoryBean的接口。它有特殊的方法称为Object getObject()

每当Spring看到,您使用的接口的实现,它调用Object getObject()方法,而不是创建类本身的实例。

在这种情况下,方法调用将返回SessionFactory对象。

更具体地说,AnnotationSessionFactoryBean实现了FactoryBean<SessionFactory>,它实际上返回SessionFactory对象,所以它可以注入到Hibernate中。

+0

也许添加一个链接到javadoc,它支持你解释的内容:http://docs.spring.io/spring /docs/current/javadoc-api/org/springframework/orm/hibernate3/annotation/AnnotationSessionFactoryBean.html – Gimby