Мой код на самом деле огромен, так что вот код.
Я пытаюсь сохранить потоки набора файлов в базе данных в одной транзакции, и эта транзакция фиксируется.
Вскоре после того, как я использую ту же транзакцию, переписываю потоки файлов в базе данных и другие данные вместе с ней. Поэтому я снова начинаю ту же транзакцию и фиксирую ее после завершения этого процесса. Но в случае исключений транзакция не откатывается и база данных обновляется новыми значениями. Что может быть причиной этого?
Пожалуйста, помогите и спасибо заранее.
try {
Map<String, String> constants = AppConstants.getAppConstants();
String hrEmailIds = constants.get(FileUploadDownloadConstants.HR_EMAIL);
entityManager.getTransaction().begin();
fileDao.setEmployeekeychangestatus(employeeID, KeyChangeJobStatus.STARTED.getValue());
entityManager.getTransaction().commit();
entityManager.flush();
setOldFileStreams(employeeID);
List <Integer>tempFileIds = fileDao.getTempFileIds(employeeID);
entityManager.clear();
KeyPair keyPair = cryptographyHelper.getKeyPairs();
PublicKey newPublicKey = keyPair.getPublic();
PrivateKey newPrivateKey = keyPair.getPrivate();
PrivateKey oldPrivateKey = job.getPrivateKey();
Tempfile tempFile;
ByteArrayOutputStream fileEncryptedWithNewKey;
for(int tempFileId : tempFileIds)
{
tempFile = fileDao.getTempFileById(tempFileId);
fileEncryptedWithNewKey = decryptAndEncryptStream(tempFile, oldPrivateKey, newPublicKey);
absolutePath = tempFile.getFilemetadata().getFilepath();
path = absolutePath.substring(0,absolutePath.lastIndexOf(File.separator));
fileDao.storeFile(fileEncryptedWithNewKey, path, tempFile.getFilemetadata().getFilename());
fileCompletionCount++;
fileEncryptedWithNewKey.close();
entityManager.clear();
intkeyChangeProgress = findPercentage(fileCompletionCount,numberOfFiles,FileUploadDownloadConstants.PRECENTAGE_TO_UPDATE_FILE_STREAM);
intkeyChangeProgress += FileUploadDownloadConstants.PRECENTAGE_TO_SET_OLD_FILE_STREAMS;
EmployeeOperationStatus.putEmployeeKeyChangeProgress(employeeID,intkeyChangeProgress);
}
intkeyChangeProgress = findPercentage(fileCompletionCount,numberOfFiles,FileUploadDownloadConstants.PRECENTAGE_TO_UPDATE_FILE_STREAM);
intkeyChangeProgress += FileUploadDownloadConstants.PRECENTAGE_TO_SET_OLD_FILE_STREAMS;
EmployeeOperationStatus.putEmployeeKeyChangeProgress(employeeID,intkeyChangeProgress);
entityManager.getTransaction().begin();
fileDao.deleteTempFilesForEmployee(employeeID);
ByteArrayOutputStream byteEncryptedPrvateKey = encryptKey(employeeID, newPrivateKey);
constants = AppConstants.getAppConstants();
String privateKeyPath = constants.get(FileUploadDownloadConstants.BASE_PRIVATE_KEY_FILE_PATH);
employee = fileDao.getEmployee(employeeID);
keyDao.updatePublicKey(employee, newPublicKey);
fileDao.removeEmployeekeychangestatus(employeeID);
fileDao.storeFile(byteEncryptedPrvateKey, privateKeyPath, employee.getUserid()+FileUploadDownloadConstants.PRIVATE_KEY_EXTENSION);
privateKeyByteArray = cryptographyHelper.getPrivateKeyBytes(newPrivateKey);
mailingService.sendMailForKeyNotification(employee.getEmail(), hrEmailIds, privateKeyByteArray,
employee.getUserid()+FileUploadDownloadConstants.PRIVATE_KEY_EXTENSION, FileUploadDownloadConstants.CHANGE_KEY);
entityManager.getTransaction().commit();
entityManager.clear();
} catch (EmprisException e) {
e.printStackTrace();
entityManager.getTransaction().rollback();
} catch (Exception e ) {
e.printStackTrace();
entityManager.getTransaction().rollback();
}
}