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