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
安德里亚
- SpringMVC和Hibernate:CannotCreateTransactionException:无法打开Hibernate Session进行事务处理;
- 是否可以使用Hibernate或JPA Annotations限制@OneToMany集合的大小?
- Java的时态库
- Java类 – 如何将Generic Object传递给函数
- Hibernate 5.2版 – >很多Query方法都弃用了?
- 关闭Hibernate 4.3中的SessionFactory
- 在运行时更改实体的表名?
- java.lang.ClassCastException:[Ljava.lang.Object; 无法强制转换为entity.UserEntity
- 如何将select表格中的多个值插入数据库?