问题
I'm learning Spring 4.0 + Hibernate 4.3 integration and I'm very new to both technologies. I'm getting errors after solving previous. Anyone please guide me to complete this successfully.
applicationContext.xml
<?xml version='1.0' encoding='UTF-8' ?>
<!-- was: <?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:p="http://www.springframework.org/schema/p"
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.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<!--bean id="propertyConfigurer"
class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"
p:location="/WEB-INF/jdbc.properties" />
<bean id="dataSource"
class="org.springframework.jdbc.datasource.DriverManagerDataSource"
p:driverClassName="${jdbc.driverClassName}"
p:url="${jdbc.url}"
p:username="${jdbc.username}"
p:password="${jdbc.password}" /-->
<!-- ADD PERSISTENCE SUPPORT HERE (jpa, hibernate, etc) -->
</beans>
dispatcher-servlet.xml
<?xml version='1.0' encoding='UTF-8' ?>
<!-- was: <?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:p="http://www.springframework.org/schema/p"
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.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-4.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">
<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping"/>
<context:component-scan base-package="com.controller"/>
<mvc:annotation-driven />
<!--
Most controllers will use the ControllerClassNameHandlerMapping above, but
for the index controller we are using ParameterizableViewController, so we must
define an explicit mapping for it.
-->
<bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
<property name="mappings">
<props>
<prop key="index.htm">indexController</prop>
</props>
</property>
</bean>
<bean id="viewResolver"
class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" />
<!--
The index controller.
-->
<bean name="indexController"
class="org.springframework.web.servlet.mvc.ParameterizableViewController"
p:viewName="index" />
</beans>
hibernate.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">
<hibernate-configuration>
<session-factory>
<property name="hibernate.connection.driver_class">oracle.jdbc.OracleDriver</property>
<property name="hibernate.connection.username">scott</property>
<property name="hibernate.connection.password">tiger</property>
<property name="hibernate.connection.url">jdbc:oracle:thin:@localhost:1521:orcl</property>
<property name="hibernate.current_session_context_class">thread</property>
<mapping resource="com/entity/EmpTest.hbm.xml"/>
</session-factory>
</hibernate-configuration>
EmpModelImpl.java
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.model;
import com.entity.EmpTest;
import com.util.HibernateUtil;
import java.math.BigDecimal;
import java.util.List;
import org.hibernate.SessionFactory;
import org.springframework.stereotype.Repository;
@Repository
public class EmpModelImp {
private SessionFactory session;
public void add(EmpTest emp) {
session=HibernateUtil.getSessionFactory();
session.getCurrentSession().save(emp);// throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
public void updateEmp(EmpTest emp) {
session=HibernateUtil.getSessionFactory();
session.getCurrentSession().update(emp);// throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
public void delete(BigDecimal EmpId) {
session=HibernateUtil.getSessionFactory();
session.getCurrentSession().delete(getEmp(EmpId));// throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
public EmpTest getEmp(BigDecimal EmpId) {
session=HibernateUtil.getSessionFactory();
return (EmpTest) session.getCurrentSession().get(EmpTest.class, EmpId);// //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
public List<EmpTest> getAll() {
session=HibernateUtil.getSessionFactory();
return session.getCurrentSession().createCriteria("from emptest").list(); //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}
EmpServiceImpl.java
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.model;
import com.entity.EmpTest;
import java.math.BigDecimal;
import java.util.List;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
@Service
public class EmpServiceImpl {
private EmpModelImp dao;
public EmpServiceImpl() {
this.dao = new EmpModelImp();
}
@Transactional
public void add(EmpTest emp) {
dao.add(emp);
}
@Transactional
public void updateEmp(EmpTest emp) {
dao.updateEmp(emp);
}
@Transactional
public void delete(BigDecimal EmpId) {
dao.delete(EmpId);
}
@Transactional
public EmpTest getEmp(BigDecimal EmpId) {
return dao.getEmp(EmpId);
}
@Transactional
public List<EmpTest> getAll() {
return dao.getAll();
}
}
I'm getting following exception.
org.hibernate.HibernateException: createCriteria is not valid without active transaction
org.hibernate.context.internal.ThreadLocalSessionContext$TransactionProtectionWrapper.invoke(ThreadLocalSessionContext.java:352)
com.sun.proxy.$Proxy98.createCriteria(Unknown Source)
com.model.EmpModelImp.getAll(EmpModelImp.java:51)
com.model.EmpServiceImpl.getAll(EmpServiceImpl.java:47)
回答1:
You need to begin and end the transaction as well.
Session session = HibernateUtil.getSessionFactory().getCurrentSession();
session.beginTransaction();
EmpTest empTest = (EmpTest) session.get(EmpTest.class, EmpId);
session.getTransaction().commit();
You can of course ask spring to do the transaction management for you. But for that you need to configure additional transactionmanager bean.
回答2:
You are getting your Session
by calling getCurrentSession()
. This gives "current session" which is bound to the lifecycle of the transaction and will be automatically flushed and closed when the transaction ends (commit or rollback). Hence you must explicitly begin a transaction
in this case. Don't forget to commit
it otherwise your session will remain open and connection won't be released.
Alternatively, if you decide to use sessionFactory.openSession()
, you'll have to manage the session yourself and to flush and close it "manually". In this case you don't need to explicitly start transactions for read only operations.
回答3:
move the @Transactional to your model Impl class so it will be
@Transactional
@Repository
public class EmpModelImp{..}
回答4:
I think that you have to write from EmpTest
with first letter in uppercase in the HQL query
public List<EmpTest> getAll() {
session=HibernateUtil.getSessionFactory();
return session.getCurrentSession().createCriteria("from Emptest").list();
}
来源:https://stackoverflow.com/questions/30420554/how-to-solve-org-hibernate-hibernateexception-createcriteria-is-not-valid-wit