2014-02-10 85 views
29

是否可以使用Spring Data JPA(由Hibernate作爲JPA提供程序支持)並同時直接使用Hibernate?同時使用Hibernate和Spring數據jpa?

的問題是,當我使用JpaTransactionManager接口,我不能夠與org.hibernate.HibernateException: No Session found for current thread檢索當前會話。當我切換到HibernateTransaction管理器時,JPA存儲庫不能提交更改。

這裏是我的Spring上下文的部分(帶有這方面我不能使用直接Hibernate調用):

<jee:jndi-lookup id="dataSource" jndi-name="jdbc/IPGCONF"/> 

<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean" 
     p:dataSource-ref="dataSource"> 
    <property name="configLocation" value="classpath:hibernate.cfg.xml"/> 
</bean> 

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="entityManagerFactory"/> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 
    </property> 
</bean> 

<bean id="transactionManager" class="org.springframework.orm.jpa.JpaTransactionManager"> 
    <property name="entityManagerFactory" ref="entityManagerFactory"/> 
    <property name="dataSource" ref="dataSource"/> 
</bean> 
<tx:annotation-driven transaction-manager="transactionManager"/> 

<jpa:repositories base-package="com.satgate"/> 

休眠庫的例子:

public Collection<Layer> listCurrent(Carrier carrier) { 
    Criteria query = sessionFactory.getCurrentSession() 
        .createCriteria(Layer.class) 
        .add(Restrictions.eq("carrier", carrier)); 
    query.createCriteria("bitrate") 
      .addOrder(Order.desc("bitrate")) 
      .add(Restrictions.eq("symbolrate", carrier.getSymbolrate())); 
    return query.list(); 
} 

春天的實例數據存儲庫定義:

public interface BitrateRepository extends PagingAndSortingRepository<Bitrate, Long> { } 

軟件版本:

<org.springframework.version>4.0.0.RELEASE</org.springframework.version> 
<org.springframework.data.version>1.4.3.RELEASE</org.springframework.data.version> 
<hibernate.version>4.3.0.Final</hibernate.version> 

所以,問題是 - 是否有可能在同一個事務(由@Transactional註解指定)中使用Spring JPA存儲庫和直接Hibernate調用以及如何實現?

回答

18

而不是創建一個SessionFactory的,使用EntityManager.unwrap(Session.class)獲得Hibernate的Session和檢索Session對象的會話工廠。

您也可以使用EntityManagerFactory.unwrap(SessionFactory.class)直接獲取Hibernate SessionFactory。

+2

如果您包含該軟件包,它會稍微有點幫助。在Spring中有數十億個包,而Eclipse本身並沒有找到一個EntityManager ... – user1944491

+0

因此,您需要JPA javax.persistence.EntityManager –

22

您需要一種配置方法來配置Hibernate和JPA。您應該使用JPA進行配置,以便刪除休眠設置。

您正在使用Hibernate4因此您可以利用的優勢,不那麼廣爲人知,春天的HibernateJpaSessionFactoryBean。如果您需要訪問SessionFactory(我認爲您需要)。

應用時,你的配置會像這樣。

<bean id="sessionFactory" class="org.springframework.orm.jpa.vendor.HibernateJpaSessionFactoryBean"> 
    <property name="entityManagerFactory" ref="entityManagerFactory" /> 
</bean> 

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"> 
    <property name="persistenceUnitName" value="entityManagerFactory"/> 
    <property name="dataSource" ref="dataSource"/> 
    <property name="jpaVendorAdapter"> 
     <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/> 
    </property> 
</bean> 

我建議只使用這個作爲中間解決方案,而你正在重構你的應用程序使用普通的JPA api。我不會建議混合這兩種策略。

+2

這比我們目前在[參考文檔](http:// docs.spring.io/spring-data/jpa/docs/current/reference/html/faq.html#d0e2924)。你介意創建一個票據來改善文檔嗎?不介意拉請求:)。 –

+4

@OliverGierke [完成](https://jira.springsource.org/browse/DATAJPA-462)&[完成](https://github.com/spring-projects/spring-data-jpa/pull/57) 。 –

+0

@ M.Deinum我確認它不是很有名,但非常優雅!一個問題,但(好奇):你爲什麼不混合兩種策略? –

相關問題