是否可以将SpringData-JPA与hibernate4.LocalSessionFactoryBean一起使用?

时间:2014-07-10 10:22:12

标签: spring hibernate spring-data spring-data-jpa

我已经在我的代码中使用LocalSessionFactoryBeanSessionFactory直接使用Hibernate 4。

我现在想在我的代码中包含Spring-Data-JPA。

但Spring-Data需要EntityManagerFactory才能工作,可以通过LocalContainerEntityManagerFactoryBean进行配置。这些Beans LocalSessionFactoryBeanLocalContainerEntityManagerFactoryBean可以在一个Spring项目中共存吗?

(或者可以由另一个改编?) 什么是最佳做法?

3 个答案:

答案 0 :(得分:4)

虽然它们可以共存,但如果您希望让它们参与同一交易,则会出现问题。但是,如果您切换逻辑并配置LocalContainerEntityManagerFactoryBean而不是LocalSessionFactoryBean,则可以使用HibernateJpaSessionFactoryBean来访问基础SessionFactory

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <!-- Your properties here -->
</bean>

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

现在你有两个并且可以参与同一个交易。

此解决方案也记录在FAQ section中的Spring Data JPA参考指南中。

答案 1 :(得分:0)

@Autowired
private EntityManager entitymanager;


public List<SpBooking> list() {
   // @SuppressWarnings("unchecked")
System.out.println("******************************");

// @SuppressWarnings("unchecked")
    List<SpBooking> listUser = (List<SpBooking>)((Session)entitymanager.getDelegate())
            .createCriteria(SpBooking.class)               
            .list();

    for (SpBooking i:listUser)
   System.out.println("------------------"+i.getBookingId());

    return listUser;
}

答案 2 :(得分:0)

从JPA 2.1开始,EntityManagerFactory.unwrap(java.lang.Class)提供了一种很好的方法,在此处记录:Here

@Bean
public SessionFactory sessionFactory(@Qualifier("entityManagerFactory") EntityManagerFactory emf) {
    return emf.unwrap(SessionFactory.class);
}