Я ловлю исключение (я специально делаю ошибку в операторе SQL, чтобы получить SQLException) при импорте записей в базу данных, и я хочу в этой записи обновления обновления в другой таблице (в обычной ситуации, когда у нас нет исключения, я также запускаюэто утверждение после импорта записей).Но проблема в том, что запись в другой таблице не обновляется, однако в console я вижу, что это обновление прошло успешно.
Во-первых, когда пользователь импортирует из записей FE, в BE мы получаем этот POST-запрос в контроллере (It_tableController
), после этого вызов sevice (It_tableService
) и сервисный вызов DAO (It_tableDAO
).И в методе DAO я ловлю SQLException (в It_tableDAO
) и пытаюсь обновить запись в другой таблице (используя import_sessionsDAO
), но это не работает.
Так почему SQL-оператор выполняется, но не обновляетзапись в блоке catch?
it_tableController.java:
@RequestMapping(value = "/*URL*/",
method = RequestMethod.POST)
@PreAuthorize("hasRole('USER')")
public ResponseEntity<List<EntityResponse>> addData(@PathVariable Integer originator_id,
@PathVariable Integer deployment_type_id,
@PathVariable Integer template_id,
@PathVariable String filename,
@RequestBody String[][] data,
@CurrentUser UserPrincipal currentUser) {
logger.info("Performing /*URL*/ POST request");
List<EntityResponse> response = it_tableService.addData(
deployment_type_id,
template_id,
originator_id,
filename,
currentUser.getId(),
currentUser.getUsername(),
data);
return new ResponseEntity<List<EntityResponse>>(response, HttpStatus.ACCEPTED);
}
It_tableService.java:
public List<EntityResponse> addData (
Integer deployment_type_id,
Integer template_id,
Integer originator_id,
String filename,
Long user_id,
String username,
String[][] data) {
if (!import_sessionsDAO.retrieveActiveImport_sessions(deployment_type_id).isEmpty())
{ return null; }
else {
Timestamp timestamp = import_sessionsDAO.insertImport_session(username, deployment_type_id, true, filename);
List<EntityResponse> responseItTable = new ArrayList<EntityResponse>();
responseItTable =
it_tableDAO.addData(deployment_type_id, template_id, originator_id, filename, user_id, username, data);
import_sessionsDAO.updateStatusOfImport_session(false, username, deployment_type_id, filename);
return responseItTable;
}
}
public Integer retrieveLastIdInTable(Integer deployment_type_id) {
Integer responseLastId = it_tableDAO.retrieveLastIdInTable(deployment_type_id);
return responseLastId;
}
it_tableDAO.java:
@Transactional
public List<EntityResponse> addData(Integer deployment_type_id,
Integer template_id,
Integer originator_id,
String filename,
Long user_id,
String username,
String[][] data) {
List<ColumnsNameModel> columnsName = getColumnsNameForDeploymentType(template_id);
List<EntityResponse> newRows = new ArrayList<EntityResponse>();
String tableName = getTableNameForDeploymentType(deployment_type_id);
String primaryKeyItTable = getPrimaryKeyItTableQuery(tableName);
// int columnsCountToItTable = getColumnsNameToItTable(columnsName, data);
for (int i = 1; i < data.length; i++) {
String INSERT_IT_TABLE_QUERY_part2 = "";
String updateFieldsOnConflict = "";
INSERT_IT_TABLE_QUERY = "INSERT INTO kddb." + tableName + " (";
for (int j = 0; j < data[0].length; j++) {
String column = "";
for (ColumnsNameModel columnName: columnsName) {
if (Objects.equals(columnName.getSource_field_name(), data[0][j]) ) {
column = columnName.getField_name_it_table();
if (j == 0 ) {
INSERT_IT_TABLE_QUERY += column;
updateFieldsOnConflict += column + "=EXCLUDED." + column;
}
else {
INSERT_IT_TABLE_QUERY += ", " + column;
updateFieldsOnConflict += ", " + column + "=EXCLUDED." + column;
}
INSERT_IT_TABLE_QUERY_part2 += ConcatinateToQuery(data[i][j], j);
}
}
}
updateFieldsOnConflict += ", import_user_id=EXCLUDED.import_user_id"+
", import_date=EXCLUDED.import_date"+
", import_file=EXCLUDED.import_file";
INSERT_IT_TABLE_QUERY += ", import_user_id, import_date, import_file)\n VALUES (";
INSERT_IT_TABLE_QUERY += INSERT_IT_TABLE_QUERY_part2;
INSERT_IT_TABLE_QUERY += ", " + user_id + ", \'" + new java.sql.Timestamp(new java.util.Date().getTime()) + "\', \'"
+ filename + "\'";
String uniqueKey = getUniqueKeyItTableQuery(tableName);
if (!Objects.equals(uniqueKey, null)) {
INSERT_IT_TABLE_QUERY += ") \n ON CONFLICT (" + uniqueKey + ") DO UPDATE SET \n" + updateFieldsOnConflict;
}
else {
INSERT_IT_TABLE_QUERY += ") \n ON CONFLICT (" + primaryKeyItTable + ") DO UPDATE SET \n" + updateFieldsOnConflict;
}
GeneratedKeyHolder holder = new GeneratedKeyHolder();
try {
jdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
PreparedStatement statement = con.prepareStatement(INSERT_IT_TABLE_QUERY, Statement.RETURN_GENERATED_KEYS);
return statement;
}
}, holder);
GeneratedKeyHolder holder = new GeneratedKeyHolder();
try {
jdbcTemplate.update(new PreparedStatementCreator() {
@Override
public PreparedStatement createPreparedStatement(Connection con) throws SQLException {
PreparedStatement statement = con.prepareStatement(INSERT_IT_TABLE_QUERY, Statement.RETURN_GENERATED_KEYS);
return statement;
}
}, holder);
} catch (Exception e) {
/* ============ THIS STATEMENT NOT UPDATE THE TABLE */
import_sessionsDAO.updateStatusOfImport_session(false, username, deployment_type_id, filename);
logger.info("++++++++++++++++++++++++++++++++++++++++");
}
/* some another actions */
return newRows;
}
import_sessionsDAO.java:
private static String UPDATE_STATUS_OF_IMPORT_SESSION =
"\n UPDATE kddb.import_sessions SET running_status = ? \n" +
" WHERE username = ? AND deployment_type_id = ? AND \n" +
" filename = ?; ";
public void updateStatusOfImport_session(Boolean running_status, String username, Integer deployment_type_id, String filename) {
logger.info(UPDATE_STATUS_OF_IMPORT_SESSION);
jdbcTemplate.update(UPDATE_STATUS_OF_IMPORT_SESSION,
running_status,
username,
deployment_type_id,
filename);
logger.info("Successfully update a status (set {}) of record with parameters: username={} deployment_type_id={} filename={}",
running_status,
username,
deployment_type_id,
filename);
}