gpt4 book ai didi

java - Hibernate和Spring数据jpa同时使用?

转载 作者:IT老高 更新时间:2023-10-28 13:44:20 25 4
gpt4 key购买 nike

是否可以同时使用 Spring Data JPA(由 Hibernate 作为 JPA 提供者提供支持)和直接使用 Hibernate?

问题是当我使用 JpaTransactionManager 时,我无法通过 org.hibernate.HibernateException: No Session found for current thread 检索当前 session 。当我切换到 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"/>

hibernate 仓库示例:

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();
}

Spring 数据仓库定义示例:

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 调用以及如何实现?

最佳答案

您需要一种配置方式,您现在正在同时配置 Hibernate 和 JPA。您应该使用 JPA 进行配置,因此请删除 hibernate 设置。

您正在使用 Hibernate4,因此您可以利用 Spring 的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 时仅将其用作中间解决方案。我不建议混合这两种策略。

关于java - Hibernate和Spring数据jpa同时使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21671731/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com