[英]manage transactions in spring mvc
我有两个表,我想用表一插入或更新表二。首先我选择表一并将结果添加到结果集中。然后我选择所有表二记录并将它们添加到列表中。然后我有一个迭代在结果集上并检查表1的记录是否在表2中,然后对其进行更新,以及表2中是否没有表1的记录保留新记录。但是在我的代码中,每次发生保留或更新不正确。
public static void main(String[] args) throws SQLException, ClassNotFoundException {
ApplicationContext applicationContext=new ClassPathXmlApplicationContext("/spring-servlet.xml");
PersonManager personManager = (PersonManager) applicationContext.getBean("x");
Person person=new Person();
person.setPerson_Name("nazanin");
person.setPerson_Family("qolamian");
person.setPerson_Kill("1");
personManager.registerPerson(person);
personManager.updatePerson();
}
和我的personManager0:
public void updatePerson() throws ClassNotFoundException, SQLException {
String getClass = "oracle.jdbc.driver.OracleDriver";
String connectionStringOracle = "jdbc:oracle:thin:@localhost:1521:orcl";
String userSqlServer = "solaris";
String passSqlServer = "myjava123";
String queryStringSelectFromOracle="select * from people ORDER BY NAME ";
Class.forName(getClass);
Connection connection = DriverManager.getConnection(connectionStringOracle,userSqlServer ,passSqlServer );
Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
ResultSet.CONCUR_READ_ONLY);
ResultSet resultSet = statement.executeQuery(queryStringSelectFromOracle);
List<Person> personList = entityManager.createQuery("select c from person c order by c.person_Name ASC ").getResultList();
for (Person person : personList) {
person.setPerson_Kill("0");
}
List<Person> personList1=new ArrayList<>();
while (resultSet.next()){
String rname = resultSet.getString("NAME");
String rfamily = resultSet.getString("FAMILY");
for (Person person : personList) {
String name = person.getPerson_Name();
String family = person.getPerson_Family();
if (name.equals(rname)){
if (family.equals(rfamily)){
person.setPerson_Kill("1");
break;
}else {
person.setPerson_Family(rfamily);
person.setPerson_Kill("1");
break;
}
}else if (family.equals(rfamily)){
person.setPerson_Name(rname);
person.setPerson_Kill("1");
break;
}else {
Person person1 = new Person();
person1.setPerson_Kill("1");
person1.setPerson_Family(rfamily);
person1.setPerson_Name(rname);
personList1.add(person1);
}
}
}
if (personList1.isEmpty()){
}else {
for (Person person : personList1) {
System.out.println("x");
registerPerson(person);
}
}
}
我真的想知道交易在春季开始和结束时如何工作吗?我可以手动管理提交或关闭连接吗?
Spring使用AOP使声明式事务有效,当然,您可以手动控制事务边界。
请记住,在春季基于代理的声明式事务,因此,如果直接调用方法,例如在代码快照中,registerPerson()方法上的事务将无法工作
在您的Spring上下文中声明一个TransactionTemplate bean。
将TransactionTemplate自动连线到您的PersonManager
@Autowire
private TransactionTemplate txTemplate;
尝试以下快照:
txTemplate.execute(new TransactionCallback<Void>(){
public Void doInTransaction(TransactionStatus txStatus){
try{
for (Person person : personList1) {
System.out.println("x");
registerPerson(person);
}
} catch(RuntimeException e){
txStatus.setRollbackOnly();
throw e;
}
return null;
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.