java - java如何解决:org.hibernate.HibernateException: createCriteria在没有活动事务的情况下无效

  显示原文与译文双语对照的内容
70 0

我正在学习 spring 4.0 + Hibernate 4.3集成,我对两种技术都非常新。我在解决以前的问题。任何人请指导我完成这项。

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();
 }
}

我得到了以下异常。

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)
时间:原作者:0个回答

...