2016-03-10 139 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