Spring HibernateeException:无法获取当前线程3的事务同步会话
我得到一个错误:Spring HibernateeException:无法获取当前线程3的事务同步会话,spring,hibernate,spring-mvc,Spring,Hibernate,Spring Mvc,我得到一个错误: org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread 如果在DataSourceContext.xml中添加以下代码段,则不会出现任何错误,应用程序也会按预期工作 <bean id="userDAO" class="com.my.portal.user.UserDAOImpl"> <property
org.hibernate.HibernateException: Could not obtain transaction-synchronized Session for current thread
如果在DataSourceContext.xml中添加以下代码段,则不会出现任何错误,应用程序也会按预期工作
<bean id="userDAO" class="com.my.portal.user.UserDAOImpl">
<property name="sessionFactory" ref="sessionFactory"/>
</bean>
UserController.java
@Entity
@Table(name="USER")
public class User {
@Id
@Column(name="UserId")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int UserId;
private String FirstName;
private String LastName;
public int getUserId() {
return UserId;
}
public void setUserId(int userId) {
UserId = userId;
}
public String getFirstName() {
return FirstName;
}
public void setFirstName(String firstName) {
FirstName = firstName;
}
public String getLastName() {
return LastName;
}
public void setLastName(String lastName) {
LastName = lastName;
}
@Override
public String toString(){
return "UserId="+UserId+", FirstName="+FirstName+", LastName="+LastName;
}
}
@Controller
public class UserController {
private static final Logger logger = LoggerFactory.getLogger(UserController.class);
private UserService userService;
@Autowired
public UserController(UserService userService){
this.userService = userService;
}
@RequestMapping(value = "/user", method = RequestMethod.GET)
public String user(Locale locale, Model model){
model.addAttribute("getUser",userService.getUser());
return "user";
}
@Repository
public interface UserDAO {
public List<User> getUser();
}
@Repository
@Transactional
public class UserDAOImpl implements UserDAO {
private static final Logger logger = LoggerFactory.getLogger(UserDAOImpl.class);
private SessionFactory sessionFactory;
@Autowired
public void setSessionFactory(SessionFactory sessionFactory){
this.sessionFactory = sessionFactory;
}
private Session currentSession() {
return sessionFactory.getCurrentSession();
}
@SuppressWarnings("unchecked")
@Override
public List<User> getUser() {
List<User> userList = currentSession().createQuery("from User").list();
return userList;
}
}
@Service
public interface UserService {
public String getMessage();
}
@Service
public class UserServiceImpl implements UserService {
private UserDAO userDAO;
@Autowired
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
public String getMessage(){
return "User Registration Page";
}
@SuppressWarnings("unchecked")
@Override
public List<User> getUser(){
logger.info("getUser()");
return this.userDAO.getUser();
}
}
UserDAO.java
@Entity
@Table(name="USER")
public class User {
@Id
@Column(name="UserId")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int UserId;
private String FirstName;
private String LastName;
public int getUserId() {
return UserId;
}
public void setUserId(int userId) {
UserId = userId;
}
public String getFirstName() {
return FirstName;
}
public void setFirstName(String firstName) {
FirstName = firstName;
}
public String getLastName() {
return LastName;
}
public void setLastName(String lastName) {
LastName = lastName;
}
@Override
public String toString(){
return "UserId="+UserId+", FirstName="+FirstName+", LastName="+LastName;
}
}
@Controller
public class UserController {
private static final Logger logger = LoggerFactory.getLogger(UserController.class);
private UserService userService;
@Autowired
public UserController(UserService userService){
this.userService = userService;
}
@RequestMapping(value = "/user", method = RequestMethod.GET)
public String user(Locale locale, Model model){
model.addAttribute("getUser",userService.getUser());
return "user";
}
@Repository
public interface UserDAO {
public List<User> getUser();
}
@Repository
@Transactional
public class UserDAOImpl implements UserDAO {
private static final Logger logger = LoggerFactory.getLogger(UserDAOImpl.class);
private SessionFactory sessionFactory;
@Autowired
public void setSessionFactory(SessionFactory sessionFactory){
this.sessionFactory = sessionFactory;
}
private Session currentSession() {
return sessionFactory.getCurrentSession();
}
@SuppressWarnings("unchecked")
@Override
public List<User> getUser() {
List<User> userList = currentSession().createQuery("from User").list();
return userList;
}
}
@Service
public interface UserService {
public String getMessage();
}
@Service
public class UserServiceImpl implements UserService {
private UserDAO userDAO;
@Autowired
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
public String getMessage(){
return "User Registration Page";
}
@SuppressWarnings("unchecked")
@Override
public List<User> getUser(){
logger.info("getUser()");
return this.userDAO.getUser();
}
}
UserServiceImpl.java
@Entity
@Table(name="USER")
public class User {
@Id
@Column(name="UserId")
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int UserId;
private String FirstName;
private String LastName;
public int getUserId() {
return UserId;
}
public void setUserId(int userId) {
UserId = userId;
}
public String getFirstName() {
return FirstName;
}
public void setFirstName(String firstName) {
FirstName = firstName;
}
public String getLastName() {
return LastName;
}
public void setLastName(String lastName) {
LastName = lastName;
}
@Override
public String toString(){
return "UserId="+UserId+", FirstName="+FirstName+", LastName="+LastName;
}
}
@Controller
public class UserController {
private static final Logger logger = LoggerFactory.getLogger(UserController.class);
private UserService userService;
@Autowired
public UserController(UserService userService){
this.userService = userService;
}
@RequestMapping(value = "/user", method = RequestMethod.GET)
public String user(Locale locale, Model model){
model.addAttribute("getUser",userService.getUser());
return "user";
}
@Repository
public interface UserDAO {
public List<User> getUser();
}
@Repository
@Transactional
public class UserDAOImpl implements UserDAO {
private static final Logger logger = LoggerFactory.getLogger(UserDAOImpl.class);
private SessionFactory sessionFactory;
@Autowired
public void setSessionFactory(SessionFactory sessionFactory){
this.sessionFactory = sessionFactory;
}
private Session currentSession() {
return sessionFactory.getCurrentSession();
}
@SuppressWarnings("unchecked")
@Override
public List<User> getUser() {
List<User> userList = currentSession().createQuery("from User").list();
return userList;
}
}
@Service
public interface UserService {
public String getMessage();
}
@Service
public class UserServiceImpl implements UserService {
private UserDAO userDAO;
@Autowired
public void setUserDAO(UserDAO userDAO) {
this.userDAO = userDAO;
}
public String getMessage(){
return "User Registration Page";
}
@SuppressWarnings("unchecked")
@Override
public List<User> getUser(){
logger.info("getUser()");
return this.userDAO.getUser();
}
}
@服务
公共类UserServiceImpl实现UserService{
私有UserDAO UserDAO;
@自动连线
公共void setUserDAO(UserDAO UserDAO){
this.userDAO=userDAO;
}
公共字符串getMessage(){
返回“用户注册页面”;
}
@抑制警告(“未选中”)
@凌驾
公共列表getUser(){
logger.info(“getUser()”);
返回这个.userDAO.getUser();
}
}
为什么在界面和impl上有@Transactional
注释?(UserServiceImpl也是如此,在类和方法getUser()上有注释)只有服务应该是事务性的,而不是dao。如果您正在使用扫描,请确保您没有扫描组件两次,并且组件需要与
处于相同的上下文中,否则事务将无法工作。我已从UserServiceImpl和UserDAO中删除了@Transactional
。如果我从UserDAOImpl中删除@Transactional
,我会得到相同的异常,即使是我在问题中提到的代码片段。我已经进行了服务事务,将@Transactional
应用到userserviceinmpl,但仍然会得到相同的错误。我只扫描了一次组件。现在我只有@M.Denium建议的userserviceinpl.java中的@Transactional
,但仍然得到相同的错误。