Spring mvc SpringMVC-JDBCTemplate-Transactional

Spring mvc SpringMVC-JDBCTemplate-Transactional,spring-mvc,jdbc,transactions,Spring Mvc,Jdbc,Transactions,我正在尝试SpringMVC和JDBCTemplate以及事务性保存。当它是事务性的,当在数据库中保存时出现任何错误时,我希望它回滚所有数据库操作。在这里,我考虑了两个表,并将两个表中的数据保存在一个具有annotation@Transactional的方法中。我特意发送了比字段的db声明大小更多的文本,以查看是否回滚了第一个表数据,但它保存在第一个表中(没有回滚)。请帮我解决这个问题 Beans.xml stdentjdbc模板: 公共类StudentJDBCTemplate实现Stude

我正在尝试SpringMVC和JDBCTemplate以及事务性保存。当它是事务性的,当在数据库中保存时出现任何错误时,我希望它回滚所有数据库操作。在这里,我考虑了两个表,并将两个表中的数据保存在一个具有annotation@Transactional的方法中。我特意发送了比字段的db声明大小更多的文本,以查看是否回滚了第一个表数据,但它保存在第一个表中(没有回滚)。请帮我解决这个问题

Beans.xml

stdentjdbc模板:
公共类StudentJDBCTemplate实现StudentDAO{
私有数据源;
私有JdbcTemplate JdbcTemplate;
@凌驾
public void setDataSource(数据源ds){
this.dataSource=ds;
this.jdbcTemplate=新的jdbcTemplate(this.dataSource);
}
@交易的
@凌驾
公共void创建(字符串名称、整数期限、整数id、字符串地址){
字符串SQL=“插入到springstudent(姓名、年龄、id)值(?,?)”;
更新(SQL、名称、年龄、id);
System.out.println(“创建的记录名=“+Name+”Age=“+Age+”id=“+id”);
SQL=“插入springaddress(名称、地址)值(?,)”;
更新(SQL、名称、地址);
System.out.println(“创建的记录名称=“+Name+”地址=“+address”);
}
@凌驾
公共学生getStudent(整数id){
返回null;
}
@凌驾
公开名单学生(){
String SQL=“从springstudent中选择*”;
List students=jdbcTemplate.query(SQL,newstudentmapper1());
留学生;
}
web.xml:

SpringSampleApplications
欢迎
org.springframework.web.servlet.DispatcherServlet
1.
欢迎
/
index.jsp
主应用程序:
publicstaticvoidmain(字符串[]args){
ApplicationContext上下文=
新的ClassPathXmlApplicationContext(“Beans.xml”);
StudentJDBCTemplate StudentJDBCTemplate=(StudentJDBCTemplate)context.getBean(“StudentJDBCTemplate”);
System.out.println(“----记录创建----”;
创建(“Zara”,11,1,“addr1”);
创建(“Nuha”,2,2,“addr2”);
创建(“Ayan”,15,3,“addr3addr1addr1”);
System.out.println(“----列出多条记录----”;
List students=studentJDBCTemplate.listStudents();
(学生记录:学生){
System.out.print(“ID:+record.getId());
System.out.print(,Name:+record.getName());
System.out.println(,Age:+record.getAge());
}

请帮助我缺少什么..谢谢确保您的数据源未设置为“autoCommit=true”

您需要在Beans.xml中添加如下内容:

<tx:annotation-driven transaction-manager="transactionManager" />


您好,谢谢您的回答--但是我使用的驱动程序是“class=”org.springframework.jdbc.datasource.DriverManagerDataSource“。当我尝试defaultAutoCommit属性时,它会抛出一个不支持该属性的错误。我尝试以另一种方式使用它--尝试{this.jdbcTemplate.getDataSource().getConnection().setAutoCommit(false);}catch(SQLException e){//TODO自动生成的catch块e.printStackTrace();}这不会引发任何错误,但保存了第一个表数据:(我猜DriverManager数据源本身没有defaultAutoCommit=false。但是我已经编辑了我的答案-您需要启用注释性事务。使用注释驱动-我在运行代码时出错错误:org.springframework.beans.factory.BeanDefinitionStoreException:从类路径r解析XML文档时发生意外异常esource[Beans.xml];嵌套的异常是java.lang.AbstractMethodError:org.springframework.Beans.factory.xml.AbstractBeanDefinitionParser.parseInternal(Lorg/w3c/dom/Element;Lorg/springframework/Beans/factory/xml/ParserContext;),如果我删除行注释驱动的代码,则代码可以工作(但事务性代码无法实现).这是完整的stacktrace吗?我无法将整个跟踪粘贴到此处..线程“main”org.springframework.beans.factory.BeanDefinitionStoreException中的异常:从类路径资源[beans.XML]解析XML文档时出现意外异常;嵌套异常为java.lang.AbstractMethodError:org.springframework.beans.factory.xml.AbstractBeanDefinitionParser.parseInternal(Lorg/w3c/dom/Element;Lorg/springframework/beans/factory/xml/ParserContext;)Lorg/springframework/beans/factory/support/AbstractBeanDefinition;位于org.springframework.beans.factory.xml.XmlBeanDefinitionReader.doLoadBeanDefinitions(XmlBeanDefinitionReader.ja)检查您使用的是javax.transaction.Transactional还是org.springframework.transaction.annotation.Transactional。@Dmytro,我在代码中使用的是import org.springframework.transaction.annotation.Transactional
    public class StudentJDBCTemplate implements StudentDAO {

        private DataSource dataSource;
        private JdbcTemplate jdbcTemplate;

        @Override
        public void setDataSource(DataSource ds) {
            this.dataSource = ds;
            this.jdbcTemplate = new JdbcTemplate(this.dataSource);
        }

        @Transactional
        @Override
        public void create(String name, Integer age, int id, String address) {
            String SQL = "insert into springstudent (name, age, id) values (?, ?, ?)";
                jdbcTemplate.update(SQL, name, age, id);
            System.out.println("Created Record Name = " + name + " Age = " + age + " id = " + id);

            SQL = "insert into springaddress (name, address) values (?, ?)";
            jdbcTemplate.update(SQL, name, address);
            System.out.println("Created Record Name = " + name + " address = " + address);

        }

        @Override
        public Student getStudent(Integer id) {
            return null;
        }

        @Override
        public List<Student> listStudents() {
            String SQL = "select * from springstudent";
            List<Student> students = jdbcTemplate.query(SQL, new StudentMapper1());
            return students;
        }
    <?xml version="1.0" encoding="UTF-8"?>
    <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"        xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee         http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
      <display-name>SpringSampleApplications</display-name>

       <servlet>
            <servlet-name>welcome</servlet-name>
            <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
            <load-on-startup>1</load-on-startup>
        </servlet>
        <servlet-mapping>
            <servlet-name>welcome</servlet-name>
            <url-pattern>/</url-pattern>
         </servlet-mapping>

      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
    </web-app>
    public static void main(String[] args) {
            ApplicationContext context = 
                     new ClassPathXmlApplicationContext("Beans.xml");

              StudentJDBCTemplate studentJDBCTemplate = (StudentJDBCTemplate)context.getBean("studentJDBCTemplate");

            System.out.println("------Records Creation--------" );
              studentJDBCTemplate.create("Zara", 11, 1, "addr1");
              studentJDBCTemplate.create("Nuha", 2, 2, "addr2");
              studentJDBCTemplate.create("Ayan", 15, 3, "addr3addr1addr1");

              System.out.println("------Listing Multiple Records--------" );
              List<Student> students = studentJDBCTemplate.listStudents();
              for (Student record : students) {
                 System.out.print("ID : " + record.getId() );
                 System.out.print(", Name : " + record.getName() );
                 System.out.println(", Age : " + record.getAge());
              }
<tx:annotation-driven transaction-manager="transactionManager" />