我正在使用SpringFramework構建一個Web應用程序。在數據訪問層中,我使用Hibernate來查詢MySQL中的數據,該數據工作正常。我SessionFactory
是這種方法建立:使用休眠和JPA構建EntityManagerFactory
public SessionFactory sessionFactory() throws HibernateException {
return new org.hibernate.cfg.Configuration()
.configure()
.buildSessionFactory();
}
今天我要與JPA,這需要一個EntityManagerFactory
我的數據訪問整合,IMO我只需要改變上面的代碼爲以下:
@Bean
public EntityManagerFactory entityManagerFactory() throws HibernateException {
return new org.hibernate.cfg.Configuration()
.configure()
.buildSessionFactory();
}
僅僅是因爲SessionFactory
延伸了EntityManagerFactory
。但是我有一個例外
java.lang.ClassCastException: org.hibernate.internal.SessionFactoryImpl不能轉換到 javax.persistence.EntityManagerFactory
這是很奇怪的,因爲SessionFactoryImpl
實現SessionFactory
而SessionFactory
延伸EntityManagerFactory
。我不知道演員爲什麼失敗。
我的問題是:1.爲什麼演員無效? 2.使用Hibernate構建EntityManagerFactory
的正確方法是什麼?
編輯調試說
factory instanceof SessionFactory //true
factory instanceof EntityManagerFactory //false
和SessionFactory
public interface SessionFactory extends EntityManagerFactory, HibernateEntityManagerFactory, Referenceable, Serializable, Closeable
我敢肯定,所有上述EntityManagerFactory
指javax.persistence.EntityManagerFactory
源。
爲什麼你會用這麼複雜的方式做到這一點?爲什麼不使用@PersistenceContext註釋將entityManager注入到bean中? – wallenborn
@wallenborn我是新來的Java(以及春季框架),所以我不知道什麼是最佳做法。由於我的「舊代碼」提供了一個'SessionFactory',我的第一個想法是重新使用它。 –