Java和Spring。 交易注释@Transactional

我想从DAO类中删除begin和commit事务,我需要使用Transactional注释。 怎么做? 现在,exception是org.hibernate.HibernateException:没有活动事务,createQuery无效

CoursesDAO.java

public interface CoursesDAO { public Course createCourse(Course course); public Course findCourseById(Integer key); public Course updateCourse(Course course); public void deleteCourse(Course course); public List getAllCourses(); public List getAllCoursesByCategory(String category); public List getAllCoursesWhichNoProposal( ); } 

CoursesDAOImpl.java

 @Repository public class CoursesDAOImpl implements CoursesDAO { @Autowired private SessionFactory sessionFactory; public Course createCourse(Course course) { Session session = sessionFactory.getCurrentSession(); //session.beginTransaction(); Integer id = (Integer) sessionFactory.getCurrentSession().save(course); course.setId(id); //session.getTransaction().commit(); return course; }; public Course findCourseById(Integer id) { Session session = sessionFactory.getCurrentSession(); //session.beginTransaction(); Course course = (Course) session.get(Course.class, id); //session.getTransaction().commit(); return course; } public Course updateCourse(Course course) { Session session = sessionFactory.getCurrentSession(); //session.beginTransaction(); session.merge(course); //session.getTransaction().commit(); return course; }; public void deleteCourse(Course course) { Session session = sessionFactory.getCurrentSession(); //session.beginTransaction(); session.delete(course); //session.getTransaction().commit(); }; public List getAllCourses() { Session session = sessionFactory.getCurrentSession(); //session.beginTransaction(); List listCourses = session.createQuery("from Course").list(); //session.getTransaction().commit(); return listCourses; } public List getAllCoursesByCategory(String category) { Session session = sessionFactory.getCurrentSession(); //session.beginTransaction(); List listCoursesByCategory = session.createQuery("from Course c where c.category='"+category+"'").list(); //session.getTransaction().commit(); return listCoursesByCategory; } public List getAllCoursesWhichNoProposal( ) { Session session = sessionFactory.getCurrentSession(); //session.beginTransaction(); List listCoursesNoProposal = session.createQuery("from Course c where c.state not like 'Proposal' and c.state not like 'Rejected'").list(); //session.getTransaction().commit(); return listCoursesNoProposal; } } 

CourseService.java

 public interface CourseService { public Course findCourseById(Integer id); public Course updateCourse(Course course); public Course createCourse(Course course); public void deleteCourse(Course course); public List getAllCourses(); public List getAllCoursesByCategory(String category); public List getAllCoursesWhichNoProposal( ); } 

CourseServiceImpl.java

 @Service public class CourseServiceImpl implements CourseService { @Autowired private CoursesDAO coursesDAOImpl; @Transactional public Course findCourseById(Integer id) { Course course = coursesDAOImpl.findCourseById(id); return course; } @Transactional public Course updateCourse(Course course) { // Course.openCurrentSessionwithTransaction(); course = coursesDAOImpl.updateCourse(course); // Course.closeCurrentSessionwithTransaction(); return course; } @Transactional public Course createCourse(Course course) { //Course.openCurrentSessionwithTransaction(); course = coursesDAOImpl.createCourse(course); //Course.closeCurrentSessionwithTransaction(); return course; } @Transactional public List getAllCourses() { // Course.openCurrentSessionwithTransaction(); List listCourses = coursesDAOImpl.getAllCourses(); // Course.closeCurrentSessionwithTransaction(); return listCourses; } @Transactional public List getAllCoursesByCategory(String category) { // Course.openCurrentSessionwithTransaction(); List listCoursesByCategory = coursesDAOImpl .getAllCoursesByCategory(category); // Course.closeCurrentSessionwithTransaction(); return listCoursesByCategory; } @Transactional public List getAllCoursesWhichNoProposal( ) { // Course.openCurrentSessionwithTransaction(); List listCoursesNoProposal = coursesDAOImpl .getAllCoursesWhichNoProposal( ); // Course.closeCurrentSessionwithTransaction(); return listCoursesNoProposal; } @Transactional public void deleteCourse(Course course) { coursesDAOImpl.deleteCourse(course); }; 

应用contex.xml

         org.hibernate.dialect.H2Dialect true 1 org.hibernate.cache.internal.NoCacheProvider thread update QWE     com.epam.edu.jtc.entity.User com.epam.edu.jtc.entity.Category com.epam.edu.jtc.entity.Course com.epam.edu.jtc.entity.UserCourse com.epam.edu.jtc.entity.ManagerCourse                 

我想在这里你有一个概念问题。

适当的架构是拥有一个调用存储库的事务服务。 像这样的东西。

 @Service public class CoursesServiceImpl implements CoursesService { @Autowired private CoursesDAO coursesDAO; @Override @Transactional public void insertCourses(Course courses) { coursesDAO.createCourse(courses); } 

}

然后你的存储库

 @Repository public class CoursesDAOImpl implements CoursesDAO { @Autowired private SessionFactory sessionFactory; public Course createCourse(Course course) { Session session = sessionFactory.getCurrentSession(); //session.beginTransaction(); Integer id = (Integer) session.save(course); course.setId(id); //session.getTransaction().commit(); return course; }; 

设置正确的事务管理器后,只是尝试将@Transactional注释移动到已实现类的方法上

  @Repository public class CoursesDAOImpl implements CoursesDAO { @Autowired private SessionFactory sessionFactory; @Transactional public Course createCourse(Course course) { 

您的配置有2个缺陷。

首先,当使用@Transactional您还必须通过在应用程序上下文文件中包含标记来明确您的配置。 如果不是,你的@Transactional什么都不做。

简单地添加

并将其添加到schemaLocation属性。

 http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd"> 

其次,您已在hibernate.current_session_context_class配置中配置了hibernate.current_session_context_class属性。 这会破坏与spring的正确集成,将其设置为自定义Spring类,但是您的设置会覆盖此类。 删除此属性。

另一件需要考虑的事情是,实际的事务边界应该是您的服务层而不是您的数据访问层。 您的服务方法是全有或全无操作,如果您有3个数据库调用,则它们都应参与同一事务。 使用您的设置,您将获得3个单独的事务,例如,在执行多个更新时,您的数据库可能会处于不受欢迎的状态。 我建议将@Transactional移动到您的服务层而不是数据访问层。