Spring Data не передает в БД - PullRequest
0 голосов
/ 03 января 2019

Мне интересно, как лучше всего переводить из DTO в базу данных через Spring Data?

Вот что я пробовал до сих пор:

    @Transactional
    public void saveTemplatesFromDTOList(List<TemplateDTO> templateDTOList) {

        for (TemplateDTO templateDTO : templateDTOList) {

            em.merge(templateDTO);

        }
    }

Однако этоне работаетЛюбой другой способ, который я пробовал с помощью метода сохранения репозитория Spring Data, не работает.Примечательно, что я пытался извлечь сущность обратно из БД через ее идентификатор, а затем обновить ее и сохранить, но это не похоже на фиксацию.

Большое спасибо.

=============

Привет Натан.Благодарю.Это не обновляется в журналах либо.Нет инструкции ОБНОВЛЕНИЕ, просто ВЫБРАТЬ

вот настройки application.properties:

#==== connect to calanco ======#
spring.jpa.hibernate.ddl-auto=none
spring.datasource.url=xxx
spring.datasource.username=xxx
spring.datasource.password=xxx
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.use-new-id-generator-mapping=true

#temporary settings
spring.jpa.properties.hibernate.show_sql=false
spring.jpa.properties.hibernate.use_sql_comments=true
spring.jpa.properties.hibernate.format_sql=true
spring.jpa.properties.hibernate.type=trace
spring.jpa.show-sql=true
logging.level.org.hibernate=TRACE

============

ОБНОВЛЕНИЕ: HappyНовый год, Кен Чан;) Я пытался извлечь сущность из БД, обновить ее и сохранить, но она не сохраняется в БД.

Вот код:

@Transactional
public void saveTemplatesFromDTOList(List<TemplateDTO> templateDTOList) {
    for (TemplateDTO templateDTO : templateDTOList) {
        Template templateFetchFromDB = templateRepo.getOne(templateDTO.getId());

        EntityToDTOConverter.fillTemplateEntityFromTemplateDTO(templateDTO, templateFetchFromDB); // does update the fields from DTO to entity fetched from DB

        templateRepo.save(templateFetchFromDB);

        em.persist(templateFetchFromDB); //doesn't work
        em.flush();
    }
}

1 Ответ

0 голосов
/ 03 января 2019

merge() работает только для экземпляра @Entity.Он не работает на DTO.

. Правильный способ - использовать entityManager, чтобы получить объект, который требует обновления, а затем обновить его значение, вызвав его методы.Когда транзакция фиксируется, изменения, сделанные вами в объекте, будут обновлены в базе данных.Обратите внимание, что вам не нужно звонить merge() для обновления, которое, как я заметил, многие мальчики делают неправильно.merge() для обновления отсоединенных объектов обратно в базу данных, что является другой историей.

Итак, общий процесс обновления одного DTO выглядит примерно так (Пожалуйста, измените его для версии списка для упражнения: D)

@Transactional
public void saveTemplatesFromDTO(TemplateDTO dto) {
    Template template = em.find(Template.class , dto.getTemplateId());

    //Get DTO value to update template
    template.setFoo(dto.getFoo());
    template.setBar(dto.getBar());
    //blablabla......

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...