当前位置: 首页 > 知识库问答 >
问题:

HibernateException:无法获取当前线程的事务同步会话。

翟俊名
2023-03-14

我对spring、hibernate和数据库都是新手。我收到“HibernateException:无法获取当前线程的事务同步会话”错误。请帮帮我.找到下面的代码。

这是控制器

@Controller
public class ProductController {
@Autowired
private ProductService productService ; 
@RequestMapping("/productTable")
public ModelAndView getProducts(Map<String, Object> map){
    Product product = new Product();
    map.put("product", product);
    map.put("productList", productService.getAllProduct());
    ModelAndView modelandview = new ModelAndView("ProductTable");
    return modelandview ;
}
@RequestMapping(value="/product.do" , method=RequestMethod.POST)
public String doActions(@ModelAttribute Product product,BindingResult           result,@RequestParam String action,Map<String, Object> map){
    Product productResult = new Product();

    if(action.toLowerCase()=="add"){
        productService.addProduct(product);
        productResult = product ;
    }
    else if(action.toLowerCase()=="edit"){
        productService.editProduct(product);
        productResult = product ;   
    }
    else if(action.toLowerCase()=="delete"){
        productService.deleteProduct(product.getProductId());
        productResult = new Product() ; 
    }

    else if(action.toLowerCase()=="search"){
        Product searchedProduct =   productService.getProduct(product.getProductId());
        productResult = searchedProduct !=null ? searchedProduct : new     Product();
    }
    else{
    }

    map.put("product", product);
    map.put("productList", productService.getAllProduct());
    return "Product" ;
}

这是EntityDaoImplementation

@Transactional
@Repository
public class ProductDaoImpl implements ProductDao{
@Autowired
private SessionFactory session ;
public void addProduct(Product product) {
    session.getCurrentSession().save(product);  
}
public void editProduct(Product product) {
    session.getCurrentSession().update(product);    
}
public void deleteProduct(int productId) {
    session.getCurrentSession().delete(getProduct(productId));  
}
public Product getProduct(int productId) {
    return session.getCurrentSession().get(Product.class,productId);
}
public List<Product> getAllProduct() {  
    return session.getCurrentSession().createQuery("from Product").list();
}

}

这是我的模特课

@Entity
@Table(name="PRODUCT")
public class Product {
@Id
@Column(name="PRODUCTID")
@GeneratedValue(strategy=GenerationType.AUTO)
private int productId ;
@Column(name="PRODUCTNAME")
private String productName;
@Column(name="PRODUCTCATEGORY")
private String productCategory ;
@Column(name="PRICE")
private float price ;
//getter-setter and constructor
}

这是服务实现

@Service
public class ProductServiceImpl implements ProductService{
@Autowired
private ProductDao productDao;

public void addProduct(Product product) {
    productDao.addProduct(product);
}

public void editProduct(Product product) {
    productDao.editProduct(product);    
}

public void deleteProduct(int productId) {
    productDao.deleteProduct(productId);    
}

public Product getProduct(int productId) {  
    return productDao.getProduct(productId);
}

public List<Product> getAllProduct() {
    return productDao.getAllProduct();
}
}

这是ProductTable.jsp

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"       pageEncoding="ISO-8859-1"%>
  <%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>
  <%@taglib uri="http://www.springframework.org/tags/form" prefix="form"%>
  <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
  <%@ include file="Common-Header.jsp"%>
  <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"         "http://www.w3.org/TR/html4/loose.dtd">
   <html>
   <head>
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Product Management</title>
</head>

<body>
<h1>Product Data</h1>
<form:form action="product.do" method="POST" commandName="product">
<table>
    <tr>
        <td>Product Id</td>
        <td><form:input path="productId"  /></td>
    </tr>
    <tr>
        <td>Product Name</td>
        <td><form:input path="productName"  /></td>
    </tr>
    <tr>
        <td>Product Category</td>
        <td><form:input path="productCategory"  /></td>
     </tr>
     <tr>
        <td>Price</td>
        <td><form:input path="price"  /></td>
     </tr>
     <tr>
        <td colspan="2">
            <input type="submit" name="action" value="Add" />
            <input type="submit" name="action" value="Edit" />
            <input type="submit" name="action" value="Delete" />
            <input type="submit" name="action" value="Search" />
        </td>
    </tr>
   </table>
   </form:form>
   <br>
   <table border="1">
   <th>Product Id</th>
   <th>Product Name</th>
   <th>Product Category</th>
   <th>Price</th>
   <c:forEach items="${productList}" var="product">
    <tr>
        <td>${product.productId}</td>
        <td>${product.productName}</td>
        <td>${product.productCategory}</td>
        <td>${product.price}</td>
    </tr>
 </c:forEach>
 </table>
 </body>
 </html>

这是web.xml

<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>Archetype Created Web Application</display-name>
<servlet>
    <servlet-name>dispatcher</servlet-name>
    <servlet-      class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>
<context-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>/WEB-INF/dispatcher-servlet.xml,
                /WEB-INF/applicationContext.xml</param-value>
</context-param>

<listener>
    <listener-  class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>

<listener>
    <listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>

null

这是Dispatcher servlet

<?xml version="1.0" encoding="UTF-8"?>
  <beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:context="http://www.springframework.org/schema/context"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"    
  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.xsd">

  <mvc:annotation-driven />
  <mvc:resources mapping="/css/**" location="/resources/css/" />
  <mvc:resources mapping="/images/**" location="/resources/images/" /> 
  <mvc:resources mapping="/resources/**" location="/resources/" />
 <context:component-scan base-package="com.quickart" />

 <bean id="viewResolver"
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/views/" />
    <property name="suffix" value=".jsp" />
</bean>

</beans>

这是ApplicationContext.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:tx="http://www.springframework.org/schema/tx"
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
http://www.springframework.org/schema/tx
 http://www.springframework.org/schema/tx/spring-tx-3.0.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.0.xsd
http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd">

<!-- Enable autowire -->
<context:annotation-config />
<context:component-scan base-package="com.quickart" />
<mvc:annotation-driven /> 
<mvc:resources mapping="/resources/**" location="/resources/" />

<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
    <property name="driverClassName" value="org.h2.Driver" />
    <property name="url" value="jdbc:h2:tcp://localhost/~/testRakesh" />
    <property name="username" value="sa" />
    <property name="password" value="" />
</bean>

<!-- Session Factory Declaration -->
<bean id="sessionFactory"
    class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
    <property name="dataSource" ref="dataSource" />
    <property name="packagesToScan" value="com.quickart" />
    <property name="hibernateProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.H2Dialect</prop>
            <prop key="hibernate.show_sql">true</prop>
            <prop key="hibernate.enable_lazy_load_no_trans">true</prop>
            <!-- <prop key="hibernate.default_schema">test</prop> -->
            <prop key="format_sql">true</prop>
            <prop key="use_sql_comments">true</prop>
            <!-- <prop key="hibernate.hbm2ddl.auto">create</prop> -->
        </props>
    </property>
</bean>
<tx:annotation-driven transaction-manager="transactionManager" />
 <bean id="transactionManager"
    class="org.springframework.orm.hibernate4.HibernateTransactionManager">
    <property name="sessionFactory" ref="sessionFactory" />
</bean>

null

请救命!谢谢.

共有2个答案

金正阳
2023-03-14

可能是因为在web.xml中,您在servlet中加载了这两个上下文。它们都扫描相同的包,但是您的dispatcher servlet没有事务管理器(并且首先加载的是ProductServiceImpl没有加载事务代理)。我会试着:

在dispatcher servlet中,使用include filter只扫描带注释的@controller类。

应用程序中,上下文使用排除筛选器扫描除@controller类以外的所有内容。

<context:component-scan base-package="org.quickart">
        <context:exclude-filter type="annotation" expression="org.springframework.stereotype.Controller"/>
     </context:component-scan>
高峻
2023-03-14

我知道现在回答已经很晚了,我也面临着这样的问题,当我用@transaction注释我的方法时,它对我很有效。



    @Transactional
    @Repository
    public class ProductDaoImpl implements ProductDao{
    @Autowired
    private SessionFactory session ;

    @Transactional
    public void addProduct(Product product) {
        session.getCurrentSession().save(product);  
    }

    @Transactional
    public void editProduct(Product product) {
        session.getCurrentSession().update(product);    
    }

    @Transactional
    public void deleteProduct(int productId) {
        session.getCurrentSession().delete(getProduct(productId));  
    }

    @Transactional
    public Product getProduct(int productId) {
        return session.getCurrentSession().get(Product.class,productId);
    }

    @Transactional
    public List getAllProduct() {  
        return session.getCurrentSession().createQuery("from Product").list();
    }

    }


 类似资料:
  • 问题内容: 我收到错误消息: 主要 @Service(“ productPartService”) @Repository(“ productPartDAO”) 如何解决? 更新: 如果我修改这样的方法: 它返回: 但是,如果我删除它最终会出现异常: 我可以通过添加来使它工作,但现在虽然链接到了,但我还是可以。如何解决? 问题答案: 错误表明没有名称为的实体。解决此问题的一种方法是将对象传递给方法

  • 尝试使用带批注的类时出现以下异常: 我初始化应用程序的方式很复杂,因此我需要提供一个指向完整基本代码的链接以获得更多信息:https://github.com/dtrunk90/webapp-base。我把它用作maven的覆盖层。 下面是必要的代码: 初始值设定项(来自webapp-base): 初始值设定项(来自我的webapp): (来自webapp-base): (来自我的webapp):

  • 问题内容: 我从xml-转换为Java-Config的Spring4 / Hibernate4项目遇到以下异常。 该项目在Eclipse中启动了属性并且没有错误,但是在第一个请求出现Exception时。在我-class我已经配置为,,,。 我所有的服务都标有。 知道这可能来自哪里吗? 编辑1 根据要求,这里是堆栈跟踪: 编辑2 奇怪的是,我从另一个项目中完美地借用了整个Java-Config代码

  • 我将一个Spring4/Hibernate4项目从xml-config转换为Java-config时遇到以下异常。 项目在Eclipse中启动upproperty和errorfree,但在第一个请求时出现异常。在我的类中,我为、、、配置了。 我的所有服务都用注释。 知道这是从哪来的吗? 编辑%1 根据要求,这里的StackTrace: 编辑2 奇怪的是,我从另一个工作完美无缺的项目中借用了整个Ja

  • 问题内容: 我使用spring + hibernate创建了一个应用程序,但始终会收到此错误。这是我第一个使用hibernate的应用程序,我阅读了一些指南,但无法解决此问题。我在哪里做错了? 这是我的应用程序的代码 student.java studentDAO.java StudentDAOImpl.java MainApp.java springConfig.xml sql 问题答案: 你必

  • 同样的问题已经被问了很多次了,但是请在重复之前仔细阅读我的问题。 我不想使用基于注释的事务管理,所以我的问题与这里提出的问题不同。 我的XML声明 遵循作为bean的DAO声明 我的TX建议 AOP配置 我的刀 我的模型 我的Hibernate映射文件 当我通过以下代码以编程方式运行此应用程序时, 它会抛出以下异常 org.hibernate.hibernateException:无法在org.s