Spring Data JPA обновляет сущность, когда я этого не хочу - PullRequest
0 голосов
/ 31 октября 2018

У меня есть ситуация, когда я хочу получить данные, но прежде чем они будут возвращены, я хочу изменить их без сохранения / сохранения.

Вот мой контроллер покоя:

@RestController
@RequestMapping("api/drawing-releases")
@CrossOrigin("*")
public class DrawingReleaseRestController {
    @Autowired
    private DrawingReleaseService service;

    @RequestMapping(method = RequestMethod.GET, value = "/{id}")
    @JsonView(View.DrawingReleaseView.class)
    public ResponseEntity<DrawingRelease> getWithId(@PathVariable int id) throws EntityNotFoundException {
      return new ResponseEntity<>(service.getByID(id),HttpStatus.OK);
    }
}

Вот реализация сервиса:

@Service
public class DrawingReleaseServiceImpl extends DrawingFunctions implements DrawingReleaseService {
    /**
     * Logging Manager
     */
    private static final Logger LOGGER=LogManager.getLogger();

    @Autowired
    private DrawingReleaseRepository repository;

    @Override
    public DrawingRelease getByID(int id) throws EntityNotFoundException {
        Optional<DrawingRelease> opt = repository.findById(id);
        ...
        // manipulate the data here
        ...
        return opt.get();
    }
}

Изначально у меня была аннотация @Transactional на сервисе. Удалив это и не имея его в методе getByID, я сначала подумал, что сессия будет открываться и закрываться с хранилищем, как указано ответом здесь .

Это не сработало, и я заметил в комментариях, что «сеанс длится всю продолжительность обработки HTTP-запроса». Итак, в сервисе я добавил

@Autowired
private EntityManager em;

и затем в методе getByID я добавил

em.close();

прежде чем я внес какие-либо изменения. Тем не менее, все сделанные мной изменения все еще сохраняются.

Можно ли каким-либо образом вносить несохраненные изменения в свой уровень обслуживания? Я полагаю, я мог бы создать несколько POJO, которые отражают сущности (но не являются сущностями), а затем скопировать данные и вернуть эти объекты, но не похоже, что мне нужно что-то подобное делать.

Ответы [ 2 ]

0 голосов
/ 31 октября 2018

Вы говорите, что хотите получить сущность, а затем изменить данные и затем вернуть их без сохранения сущности, но ИМХО, вам не следует использовать эту сущность для этого. Почему вы меняете данные и что пользователь собирается с ними делать, поскольку они больше не представляют то, что находится в базе данных. Какие еще изменения будут внесены или какие другие предположения (это объект базы данных) будут недействительными?

Если вы используете объект базы данных для получения другого объекта, у вас должен быть другой класс для этой цели. Это часто встречается и называется объектом передачи данных (DTO), и их можно создавать из spring-data-jpa напрямую, используя проекцию. Ваш объект Dto будет принимать сущность в качестве конструктора и заполнять любые свойства, которые он хочет получить от сущности. Dto не является постоянным объектом, поэтому нет проблем с его сохранением.

Гораздо более понятный и понятный дизайн, соответствующий Принципам SOLID и структуре кода .

0 голосов
/ 31 октября 2018

Да, вы можете detach сущность из контекста постоянства: https://docs.oracle.com/javaee/7/api/javax/persistence/EntityManager.html#detach-java.lang.Object-

...