Spring Data未提交到数据库

时间:2019-01-03 13:54:18

标签: java spring hibernate spring-boot spring-data

我想知道最佳实践是通过Spring Data将DTO转换为数据库吗?

这是我到目前为止所尝试的:

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

        for (TemplateDTO templateDTO : templateDTOList) {

            em.merge(templateDTO);

        }
    }

但是,这不起作用。我尝试过使用Spring Data存储库保存方法的任何其他方式均不起作用。值得注意的是,我尝试通过ID从数据库取回实体,然后对其进行更新和保存,但这似乎没有落实。

非常感谢。

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

你好,内森。谢谢。它也不会在日志中更新。没有UPDATE指令,只是SELECT

这是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

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

更新:新年快乐,Ken Chan;)我确实尝试从DB取回该实体,对其进行更新并保存,但是它并没有持久到DB中。

这是代码:

@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 :(得分:0)

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......

}