我想知道最佳实践是通过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();
}
}
答案 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......
}