我使用spring + hibernate创建了一个应用程序,但始终会收到此错误。这是我第一个使用hibernate的应用程序,我阅读了一些指南,但无法解决此问题。我在哪里做错了?
这是我的应用程序的代码
ott 05, 2014 4:03:06 PM org.springframework.context.support.ClassPathXmlApplicationContext prepareRefresh Informazioni: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@1eab16b: startup date [Sun Oct 05 16:03:06 CEST 2014]; root of context hierarchy ott 05, 2014 4:03:06 PM org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions Informazioni: Loading XML bean definitions from class path resource [springConfig.xml] ott 05, 2014 4:03:08 PM org.hibernate.annotations.common.reflection.java.JavaReflectionManager <clinit> INFO: HCANN000001: Hibernate Commons Annotations {4.0.5.Final} ott 05, 2014 4:03:08 PM org.hibernate.Version logVersion INFO: HHH000412: Hibernate Core {4.3.6.Final} ott 05, 2014 4:03:08 PM org.hibernate.cfg.Environment <clinit> INFO: HHH000206: hibernate.properties not found ott 05, 2014 4:03:08 PM org.hibernate.cfg.Environment buildBytecodeProvider INFO: HHH000021: Bytecode provider name : javassist ott 05, 2014 4:03:09 PM org.hibernate.dialect.Dialect <init> INFO: HHH000400: Using dialect: org.hibernate.dialect.MySQL5Dialect ott 05, 2014 4:03:09 PM org.hibernate.engine.transaction.internal.TransactionFactoryInitiator initiateService INFO: HHH000399: Using default transaction strategy (direct JDBC transactions) ott 05, 2014 4:03:09 PM org.hibernate.hql.internal.ast.ASTQueryTranslatorFactory <init> INFO: HHH000397: Using ASTQueryTranslatorFactory Exception in thread "main" org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread at org.springframework.orm.hibernate4.SpringSessionContext.currentSession(SpringSessionContext.java:134) at org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:1014) at coreservlets.StudentDAOImpl.create(StudentDAOImpl.java:19) at coreservlets.MainApp.main(MainApp.java:14)
student.java
package coreservlets; public class Student { private Integer id; private String name; private Integer age; public Integer getId(){return id;}//getId public void setId(Integer id){this.id=id;}//setId public String getName(){return name;}//getName public void setName(String name){this.name=name;}//setName public Integer getAge(){return age;}//getAge public void setAge(Integer age){this.age=age;}//setAge }//Student
studentDAO.java
package coreservlets; import org.hibernate.SessionFactory; public interface StudentDAO { public void setSessionFactory(SessionFactory sessionFactory); public void create(String name,Integer age); }//StudentDAO
StudentDAOImpl.java
package coreservlets; import org.hibernate.Session; import org.hibernate.SessionFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; @Repository public class StudentDAOImpl implements StudentDAO { private SessionFactory sessionFactory; @Autowired public void setSessionFactory(SessionFactory sessionFactory){ this.sessionFactory=sessionFactory; }//setSessionFactory public void create(String name,Integer age){ Session session=sessionFactory.getCurrentSession(); Student student=new Student(); student.setName(name); student.setAge(age); session.save(student); }//create }//StudentDAOImpl
MainApp.java
package coreservlets; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class MainApp { public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("springConfig.xml"); StudentDAOImpl student=(StudentDAOImpl) context.getBean("studentDAOImpl"); student.create("Alessandro", new Integer(33)); }//main }//MainApp
springConfig.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.1.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.1.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.1.xsd"> <context:annotation-config/> <context:component-scan base-package="coreservlets"/> <bean id="dataSource" class="org.apache.commons.dbcp2.BasicDataSource"> <property name="driverClassName" value="com.mysql.jdbc.Driver"/> <property name="url" value="jdbc:mysql://localhost:3306/spring_hibernate"/> <property name="username" value="root"/> <property name="password" value="password"/> <property name="initialSize" value="5"/> <property name="maxTotal" value="10"/> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean"> <property name="dataSource" ref="dataSource"/> <property name="hibernateProperties"> <value> hibernate.dialect=org.hibernate.dialect.MySQLDialect </value> </property> </bean> </beans>
sql
create table student ( id integer not null auto_increment, name varchar(20) not null, age integer not null, primary key(id) );
你必须启用交易支持(<tx:annotation-driven>或@EnableTransactionManagement)并声明,transactionManager并且它应通过进行工作SessionFactory。
(<tx:annotation-driven>
@EnableTransactionManagement)
transactionManager
SessionFactory
你必须添加@Transactional到你的@Repository
@Transactional
@Repository
随着@Transactional在你的@Repositoryspring是能够应用的事务处理支持到你的资料库。
你的Student类没有@ javax.persistence。*注释how @Entity,我假设该类的映射配置已通过XML定义。
Student
@ javax.persistence
@Entity