Я пишу приложение, которое соединяется с Oracle Database. Я вызываю функцию из БД, которая вставляет новые записи в таблицу. И после этого обратного вызова я могу решить, что я хочу сделать: фиксация или откат.Настроить транзакцию весной 4.1.5 без XML
Unfortunalety Я новичок весной, поэтому у меня проблемы с конфигурацией. И более того, я хочу сделать эту конфигурацию в Java-классе, а не в XML. И здесь мне нужна твоя помощь.
ОБНОВЛЕНО КОД:
ApplicationConfig код:
@Configuration
@EnableTransactionManagement
@ComponentScan("hr")
@PropertySource({"classpath:jdbc.properties", "classpath:functions.properties", "classpath:procedures.properties"})
public class ApplicationConfig {
@Autowired
private Environment env;
@Bean(name="dataSource")
public DataSource dataSource() {
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName(env.getProperty("jdbc.driver"));
dataSource.setUrl(env.getProperty("jdbc.url"));
dataSource.setUsername(env.getProperty("jdbc.username"));
dataSource.setPassword(env.getProperty("jdbc.password"));
dataSource.setDefaultAutoCommit(false);
return dataSource;
}
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
JdbcTemplate jdbcTemplate = new JdbcTemplate(dataSource);
jdbcTemplate.setResultsMapCaseInsensitive(true);
return jdbcTemplate;
}
@Bean(name="txName")
public PlatformTransactionManager txManager() {
DataSourceTransactionManager txManager = new DataSourceTransactionManager();
txManager.setDataSource(dataSource());
return txManager;
}
}
У меня есть Дао и сервис, где и реализует соответствующий интерфейс.
реализация Услуги: реализация
@Service
public class HumanResourcesServiceImpl implements HumanResourcesService {
@Autowired
private HumanResourcesDao hrDao;
@Override
public String generateData(int rowsNumber) {
return hrDao.generateData(rowsNumber);
}
@Override
@Transactional("txName")
public void shouldCommit(boolean doCommit, Connection connection) throws SQLException {
hrDao.shouldCommit(doCommit, connection);
}
}
Dao:
@Repository
public class HumanResourcesDaoImpl implements HumanResourcesDao {
private JdbcTemplate jdbcTemplate;
private SimpleJdbcCall generateData;
@Autowired
public HumanResourcesDaoImpl(JdbcTemplate jdbcTemplate, Environment env) {
this.jdbcTemplate = jdbcTemplate;
generateData = new SimpleJdbcCall(jdbcTemplate)
.withProcedureName(env.getProperty("procedure.generateData"));
}
@Override
public String generateData(int rowsNumber) {
HashMap<String, Object> params = new HashMap<>();
params.put("i_rowsNumber", rowsNumber);
Map<String, Object> m = generateData.execute(params);
return (String) m.get("o_execution_time");
}
@Override
@Transactional("txName")
public void shouldCommit(boolean doCommit, Connection connection) throws SQLException {
if(doCommit) {
connection.commit();
} else {
connection.rollback();
}
}
}
Главный код класса:
public class Main extends Application implements Initializable {
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
ApplicationContext context = new AnnotationConfigApplicationContext(ApplicationConfig.class);
hrService = context.getBean(HumanResourcesService.class);
BasicDataSource ds = (BasicDataSource)context.getBean("dataSource");
Connection connection = ds.getConnection();
//do something and call
//hrService.generateData
//do something and call
//hrService.shouldCommit(true, connection);
//which commit or rollback generated data from previoues callback
}
}
UPDATE:
Я думаю, что проблема с подключением, потому что это утверждение:
this.jdbcTemplate.getDataSource().getConnection();
создает новое соединение, так, то нет ничего, чтобы совершить или откат. Но все же я не могу понять, почему это не работает должным образом. Нет ошибок, нет новых записей ... Что странно, это то, что когда я отлаживал connection.commit(); я узнал, что в DelegatingConnection.java, параметр это имеет правильное соединение, но есть что-то вроде:
_conn.commit();
и _conn имеет другое соединение. Зачем?
Должен ли я каким-то образом синхронизировать соединение для этих двух методов или что? Или это только одно соединение? Честно говоря, я не уверен, как это работает. Одно соединение и все обратные вызовы к хранимым процедурам находятся в этом соединении или, возможно, с каждым обратным вызовом создается новое соединение?
Реальный вопрос: как фиксировать или откатывать данные предыдущего обратного вызова, которые вставляются в таблицу?
Что вы думаете об этом? в чем проблема? –
Проблема в том, что я не могу ее правильно настроить ... Даже с инструкциями ниже этого не работает ... – Lui
Вопрос должен состоять в следующем: как зафиксировать или отменить данные из предыдущего обратного вызова, которые вставляются в таблицу. – Lui