2015-04-21 3 views
2

Я новичок в реализации JDBC. Я создаю страницу регистрации, в которой мне нужно вставлять строки в несколько таблиц.Установить AutoCommit False через несколько DAO spring mvc

Для каждой таблицы я использую DAO и в одном из классов услуг я вызываю все методы вставки DAO. В каждом методе ввода DAO я создаю новое соединение с использованием источника данных и выполнения.

Теперь, если во время вставки возникает ошибка, я хочу отменить все инструкции вставки.

Я знаю, что был

connection.setAutoCommit(false) 

Теперь, как я могу создать соединение раз и resuse то же самое в других DAO-х. Таким образом, я могу использовать точки сохранения и механизмы отката

Есть ли какой-либо другой другой отправка отправки соединение как параметр.

Как я мог достичь этого?

Ниже приведен пример кода со страницы услуг:

 Sucessfull = firstDAO.save(firstDAOObj); 
    if(Sucessfull){ 
     Sucessfull = secondDAO.save(secondDAOObj); 
    } 
    if(Sucessfull){ 
     Sucessfull = thirdDAO.save(thirdDAOObj); 
    } 
+0

Вы получаете некоторые странные ответы здесь. я бы рассмотрел некоторые примеры приложений, написанные весной. –

+1

@NathanHughes, Направьте меня, если найдете какие-либо примеры приложений, – SpringUser

+0

. Вы можете обратиться к Spring's [Управление транзакциями] (http://docs.spring.io/spring/docs/current/spring-framework-reference/html/ transaction.html). – GriffeyDog

ответ

0

Я думаю, что это поможет вам

try{ 
    //Assume a valid connection object conn 
    conn.setAutoCommit(false); 
    Statement stmt = conn.createStatement(); 

    String SQL = "INSERT INTO Employees " + 
       "VALUES (106, 20, 'Rita', 'Tez')"; 
    stmt.executeUpdate(SQL); 
    //Submit a malformed SQL statement that breaks 
    String SQL = "INSERTED IN Employees " + 
       "VALUES (107, 22, 'Sita', 'Singh')"; 
    stmt.executeUpdate(SQL); 
    // If there is no error. 
    conn.commit(); 
}catch(SQLException se){ 
    // If there is any error. 
    conn.rollback(); 
} 
+0

Я отредактировал вопрос, я хочу создать соединение один раз и хочу повторить одно и то же во всех других DAO, чтобы использовать функции сохранения и функцию autocommit ... Не могли бы вы заглянуть в то, что – SpringUser

+0

Я отредактировал ответ. Скопировать() и rollback() можно использовать соответственно. – Sanke

+0

В приведенном выше примере оба оператора sql находятся в одном методе, но у нас есть разные операторы в разных классах, и мы хотим использовать одно и то же соединение ... – SpringUser

0

Я не уверен, почему вы используете DAO для каждой таблицы (я предполагаю, что все ваши таблицы находятся в одной базе данных). Я бы, вероятно, использовал один DAO. Я также не использовал бы отдельное соединение для каждого вызова. Вот общий шаблон я использую для такого рода вещи:

я ставлю это в верхней части моего DAO:

private DataSource myDs= new JndiDataSourceLookup().getDataSource("<string name of your datasource>"); 
private DataSourceTransactionManager transactionManager = new DataSourceTransactionManager(myDs); 
private SimpleJdbcTemplate sjt = new SimpleJdbcTemplate(myDs); 

Тогда дальше у меня есть что-то вроде этого в способе, где я прохожу в объекты, содержащие данные, которые я хочу вставить. Этот метод DAO будет называться вашим класс обслуживания слоя:

DefaultTransactionDefinition def = new DefaultTransactionDefinition(); 
TransactionStatus status = transactionManager.getTransaction(def); 
try { 
    // put all of your inserts in here using the SimpleJdbcTemplate 
    // that was declared above 

    transactionManager.commit(status); 
} catch(Throwable t) { 
    try { 
     transactionManager.rollback(status); 
    } catch (Throwable t2) { 
     log.error("Error rolling back transaction", t2); 
    } 
    throw new DataAccessException(t); 
} 

С весной есть и другие способы сделать операции один из которых включает в себя аннотацию, но это может быть немного сложнее. Я бы рекомендовал изучить это для ваших будущих приложений.

+0

Я хочу сгруппировать все связанные с таблицей операторы в одном классе, поэтому я внедрил отдельный DAO для каждой таблицы. В моей БД будет много таблиц, есть ли другой способ достичь вышеуказанного – SpringUser

+0

@SpringUser - я действительно не думаю, что наличие отдельного DAO для таблицы - хороший дизайн. Если у вас 50 таблиц в вашей базе данных, вы получите 50 DAO. Сказав это, вы раньше использовали аннотации Spring? Вы хотите аннотации транзакций базы данных Google Spring для версии Spring, которую вы используете. Они отлично справляются с этим. Это позволит вам разместить соответствующую аннотацию по методам DAO, которые вы хотите принять участие в транзакции, в нескольких классах DAO. – Troy

+0

Спасибо @Troy, я буду искать аннотации транзакций базы данных Spring и вернуться к вам в случае возникновения вопросов. – SpringUser

Смежные вопросы