我已经在我的代码中使用LocalSessionFactoryBean
和SessionFactory
直接使用Hibernate 4。
我现在想在我的代码中包含Spring-Data-JPA。
但Spring-Data需要EntityManagerFactory
才能工作,可以通过LocalContainerEntityManagerFactoryBean
进行配置。这些Beans LocalSessionFactoryBean
和LocalContainerEntityManagerFactoryBean
可以在一个Spring项目中共存吗?
(或者可以由另一个改编?) 什么是最佳做法?
答案 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);
}