Java Spring Hibernate 5异常:HibernateException:无法获取当前线程的事务同步会话
我正在Github上进行培训,但现在遇到了一个例外Java Spring Hibernate 5异常:HibernateException:无法获取当前线程的事务同步会话,java,spring,hibernate,spring-mvc,Java,Spring,Hibernate,Spring Mvc,我正在Github上进行培训,但现在遇到了一个例外 org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread org.springframework.w
org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:986)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:881)
javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:855)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
root cause
org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
org.springframework.orm.hibernate5.SpringSessionContext.currentSession(SpringSessionContext.java:136)
org.hibernate.internal.SessionFactoryImpl.getCurrentSession(SessionFactoryImpl.java:465)
common.dao.AbstractHibernateDAO.getCurrentSession(AbstractHibernateDAO.java:54)
common.dao.AbstractHibernateDAO.create(AbstractHibernateDAO.java:31)
com.department.model.DepartmentServiceImpl.addDepartment(DepartmentServiceImpl.java:21)
com.controller.DepartmentController.Insert(DepartmentController.java:29)
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
java.lang.reflect.Method.invoke(Method.java:498)
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:209)
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:136)
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:102)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:871)
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:777)
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:991)
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:925)
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978)
org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:881)
javax.servlet.http.HttpServlet.service(HttpServlet.java:650)
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:855)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
我在谷歌上搜索过这个异常,知道它的注释,比如@Service@Controller@Repository@Transactional和added
我也使用Junit,它工作得很好
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
public class AppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
@Override
protected Class<?>[] getRootConfigClasses() {
return new Class[] { HibernateConf.class };
}
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[] { WebMvcConfig.class };
}
@Override
protected String[] getServletMappings() {
return new String[] { "/" };
}
}
webmvcconfig
@Configuration
@EnableWebMvc
@ComponentScan({"com.controller","com.department.model" , "com.employee.model" , "com.project.model"})
public class WebMvcConfig implements WebMvcConfigurer {
@Bean
public InternalResourceViewResolver resolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setViewClass(JstlView.class);
resolver.setPrefix("/WEB-INF/");
resolver.setSuffix(".jsp");
return resolver;
}
}
实体
package com.department.model;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import com.employee.model.EmployeeVO;
@Entity
@Table(name = "department")
public class DepartmentVO implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "department_id")
private Integer department_id;
@Column(name = "dname")
private String dname;
@Column(name = "loc")
private String loc;
@OneToMany(cascade = CascadeType.ALL , mappedBy = "departmentVO" , fetch = FetchType.EAGER) // lazy = false
private Set<EmployeeVO> employees = new HashSet<EmployeeVO>();
public DepartmentVO() {
super();
}
public Integer getDepartment_id() {
return department_id;
}
public void setDepartment_id(Integer department_id) {
this.department_id = department_id;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
public Set<EmployeeVO> getEmployees() {
return employees;
}
public void setEmployees(Set<EmployeeVO> employees) {
this.employees = employees;
}
}
我很确定我使用了与您相同的教程,我在服务类上使用了@Transactional注释,而不是在存储库上。我不明白为什么会有什么不同,但你试过这种方法吗?我遇到了完全相同的错误,这是因为我的主线程由于缺少bean而崩溃,而实体管理器正在关闭,这导致其他线程无法启动事务。这已经是一个很大的代码集,似乎不是最小的。通过包含注释掉的代码来扩大它是没有帮助的。@KarlRichter好的,我删除了它,很抱歉放了一些无用的代码。你的意思是我把@Transactional从dao放到服务中吗?我做了,但我得到了同样的错误我只做了spring-hibernate-5演示的教程,使用spring mvc,我使用了我老师以前教我的示例,所以我对其中两个感到困惑,无论如何,谢谢,我明天会检查这个错误让我知道,你的代码在分解方式、配置类方面与我的非常相似,等等,我刚刚注意到,你的会话工厂被声明为final,然后你在它上面设置了一堆属性,这不是一个问题吗?不,不是,我删除了两个“final”,错误没有改变
package com.department.model;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import com.employee.model.EmployeeVO;
@Entity
@Table(name = "department")
public class DepartmentVO implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "department_id")
private Integer department_id;
@Column(name = "dname")
private String dname;
@Column(name = "loc")
private String loc;
@OneToMany(cascade = CascadeType.ALL , mappedBy = "departmentVO" , fetch = FetchType.EAGER) // lazy = false
private Set<EmployeeVO> employees = new HashSet<EmployeeVO>();
public DepartmentVO() {
super();
}
public Integer getDepartment_id() {
return department_id;
}
public void setDepartment_id(Integer department_id) {
this.department_id = department_id;
}
public String getDname() {
return dname;
}
public void setDname(String dname) {
this.dname = dname;
}
public String getLoc() {
return loc;
}
public void setLoc(String loc) {
this.loc = loc;
}
public Set<EmployeeVO> getEmployees() {
return employees;
}
public void setEmployees(Set<EmployeeVO> employees) {
this.employees = employees;
}
}
package com.department.model;
import java.util.Set;
import common.dao.Operations;
public interface DepartmentDAO extends Operations<DepartmentVO> {
}
package com.department.model;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;
import common.dao.AbstractHibernateDAO;
@Repository
@Transactional
public class DepartmentDAOImpl extends AbstractHibernateDAO<DepartmentVO> implements DepartmentDAO {
public DepartmentDAOImpl() {
super();
setClazz(DepartmentVO.class);
}
}
package com.department.model;
import java.util.List;
public interface DepartmentService {
List<DepartmentVO> getAll();
void addDepartment(DepartmentVO departmentVO);
}
package com.department.model;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class DepartmentServiceImpl implements DepartmentService{
@Autowired
private DepartmentDAO dao;
@Override
public List<DepartmentVO> getAll() {
return dao.findAll();
}
@Override
public void addDepartment(DepartmentVO departmentVO) {
dao.create(departmentVO);
}
}
package com.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import com.department.model.DepartmentService;
import com.department.model.DepartmentVO;
@Controller
@RequestMapping("/dept")
public class DepartmentController {
@Autowired
private DepartmentService deptSvc;
@GetMapping("addDept")
public String addDept(ModelMap model) {
DepartmentVO departmentVO = new DepartmentVO();
model.addAttribute("departmentVO" , departmentVO);
return "dept/addDept";
}
@PostMapping("insert")
public String Insert(DepartmentVO departmentVO , ModelMap model) {
deptSvc.addDepartment(departmentVO);
return "dept/addDept";
}
}