aka*_*ihi 32 java spring hibernate jpa spring-data
是否可以使用Spring Data JPA(由Hibernate作为JPA提供程序支持)并同时直接使用Hibernate?
问题是,当我使用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"/>
Run Code Online (Sandbox Code Playgroud)
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();
}
Run Code Online (Sandbox Code Playgroud)
Spring数据存储库定义的示例:
public interface BitrateRepository extends PagingAndSortingRepository<Bitrate, Long> { }
Run Code Online (Sandbox Code Playgroud)
软件版本:
<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>
Run Code Online (Sandbox Code Playgroud)
所以,问题是 - 是否可以在同一个事务中使用(由@Transactional注释指定)Spring JPA存储库和直接Hibernate调用以及如何实现它?
M. *_*num 25
您需要一种配置方式,现在正在配置Hibernate和JPA.您应该使用JPA进行配置,因此请删除hibernate设置.
您正在使用Hibernate4,因此您可以利用HibernateJpaSessionFactoryBeanSpring 不是众所周知的优势.如果您需要访问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>
Run Code Online (Sandbox Code Playgroud)
我建议您只使用它作为中间解决方案,同时重构您的应用程序以使用普通的JPA api.我不建议混合两种策略.
nei*_*ldo 20
而不是创建SessionFactory,用于EntityManager.unwrap(Session.class)获取Hibernate会话并从Session对象中检索会话工厂.
您还可以使用EntityManagerFactory.unwrap(SessionFactory.class)直接获取Hibernate SessionFactory.
| 归档时间: |
|
| 查看次数: |
19386 次 |
| 最近记录: |