Предположим, что «Проект» - это POJO. На служебном уровне моего проекта я написал функцию, которая получает строку из таблицы.
@Override
public ProjectDto getAProject(Long id) {
try {
Project project = projectRepository.getOne(id);
if (project==null) {
throw new IllegalArgumentException("Project not found");
} else {
return modelMapper.map(project, ProjectDto.class);
}
} catch (EntityNotFoundException ex) {
throw new IllegalArgumentException("Project not found");
}
}
Функция работает нормально с уже существующими значениями идентификатора. Но если я даю несуществующее значение, возникает исключение, подобное следующему. Похоже, что функция «getOne ()» не генерирует исключение «EntityNotFoundException».
ModelMapper mapping errors: Error mapping com.issuemanagement.entity.Project to com.issuemanagement.dto.ProjectDto
, что означает, что исключение исходит из логики отображения модели c. Потому что объект "project" заполнен нулевыми значениями, поэтому не может отображаться в класс DTO. Я изменил функцию следующим образом, чтобы исправить это.
@Override
public ProjectDto getAProject(Long id) {
boolean isExist = projectRepository.existsById(id);
if (isExist) {
Project project = projectRepository.getOne(id);
return modelMapper.map(project, ProjectDto.class);
} else {
throw new IllegalArgumentException("Project not found");
}
}
но при этом программа дважды попадает в БД. Мне это не нравится Как я могу сделать эту операцию только с одной транзакцией?
Кстати, если я пытаюсь запустить функцию "проекта" toString (), она выдает "EntityNotFoundException", но это выглядит как не официальный путь. или это так? Я надеюсь, что где-то должна быть логическая переменная.