Spring + Hibernate不会自动打开会话

我正在使用以下架构在Spring应用程序中开发Hibernate DAO:

我有一个PersonDAO接口,我在其中声明了我想要的CRUD方法,然后我创建了一个实现此接口的具体类PersonDAOImpl,这个:

package org.andrea.myexample.HibernateOnSpring.dao; import org.andrea.myexample.HibernateOnSpring.entity.Person; import org.hibernate.SessionFactory; import org.springframework.stereotype.Repository; import org.springframework.transaction.annotation.Transactional; @Repository @Transactional public class PersonDAOImpl2 { // Factory per la creazione delle sessioni di Hibernate: private static SessionFactory sessionFactory; // Metodo Setter per l'iniezione della dipendenza della SessionFactory: public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; System.out.println("Ho iniettato la SessionFactory: " + sessionFactory); } /** CREATE CRUD Operation: * Aggiunge un nuovo record rappresentato nella tabella rappresentato * da un oggetto Person */ @Transactional(readOnly = false) public Integer addPerson(Person p) { System.out.println("Inside addPerson()"); System.out.println("Connessione aperta: " + sessionFactory.getCurrentSession().isOpen()); System.out.println("E' connesa:" + sessionFactory.getCurrentSession().isConnected()); Integer personID = personID = (Integer) sessionFactory.getCurrentSession().save(p); return personID; } } 

然后我创建一个MainApp类来竞争main()方法来测试它是如何工作的。

问题是当我尝试在数据库中插入新记录时执行MainApp时,我在stacktrace中获取以下错误消息:

 INFO: Using DataSource [org.apache.commons.dbcp.BasicDataSource@446adaa2] of Hibernate SessionFactory for HibernateTransactionManager Ho iniettato la SessionFactory: org.hibernate.internal.SessionFactoryImpl@34a8a14b Contesto recuperato: org.springframework.context.support.ClassPathXmlApplicationContext@70501e4e: startup date [Sat Mar 09 10:02:37 CET 2013]; root of context hierarchy Creato persona1: org.andrea.myexample.HibernateOnSpring.entity.Person@2d35bcd7 Exception in thread "main" java.lang.ClassCastException: org.andrea.myexample.HibernateOnSpring.dao.PersonDAOImpl2$$EnhancerByCGLIB$$d0c4a932 cannot be cast to org.andrea.myexample.HibernateOnSpring.dao.PersonDAO at org.andrea.myexample.HibernateOnSpring.MainApp.main(MainApp.java:26) 

好像它没有找到Session对象,现在我有一个疑问:我知道Spring会自动打开并关闭每个@Transactional方法的Session,但它似乎不起作用!

相反,如果我在调用方法时显式打开一个新会话,它运行良好……这样:

 @Transactional(readOnly = false) public Integer addPerson(Person p) { System.out.println("Inside addPerson()"); Session session = sessionFactory.openSession(); Transaction tx = null; Integer personID = null; try { tx = session.beginTransaction(); personID = (Integer) session.save(p); tx.commit(); } catch (HibernateException e) { if (tx != null) tx.rollback(); e.printStackTrace(); } finally { session.close(); } return personID; } 

但我认为我可以说Spring在输入方法时自动打开Session并在退出时关闭它

这是我的XML配置文件:

                org.hibernate.dialect.MySQLDialect update false              

有人可以帮帮我吗?

TNX

安德里亚

您需要为DAO使用接口或重新配置代理机制以使用类。

你必须告诉Spring何时“打开”会话。 有准备好使用Spring实现,在执行请求之前打开会话。