How to Solve : org.hibernate.HibernateException: createCriteria is not valid without active transaction

旧街凉风 提交于 2019-12-11 05:05:01

问题


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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!