我有实体文档,它有很多列,一对一,一对多和许多到其他实体的映射。
示例:
Document:
id,
title,
body,
authors,
viewers,
...使用REST,我想更新一些特定的文档,控制器接收序列化的文档对象,调用EntityManager的merge方法将空结果持久化到数据库,如果控制器只接收到主体,那么我希望只更新主体,但是合并删除标题、作者和查看器等的记录。
我知道这是EntityManager的一种标准行为,但我想问的是,在不从前端或其他端点接收整个实体的情况下,对实体进行更新的最首选技术是什么。是使用接收到的id从数据库加载实体并手动设置所有字段,然后保存到数据库,还是使用另一种技术。
我没有任何问题,手动编写所有的设置,以复制更改,但实体的规模真的很大,有很多关系。在这种情况下寻求最佳实践。
我了解DTO,但我希望在将实体用于控制器和服务方法时采用替代方法。
发布于 2018-04-24 16:32:30
对于实体部分更新,您需要使用条件api或jpql .如果您使用的是不允许jpql更新的旧版本的标准更新或旧查询解析器,则必须先从数据库读取,然后再插入.您还可以使用updatable=false来设置只应在创建时设置的列(如CREATION_DATE),而且hibernate中还有一个很好的特性,名为@DynamicUpdate,我还没有尝试过,但是看起来很棒……它只更新修改后的字段(查查弗拉德的帖子) .关于DTO DP,如果您想隐藏/修改客户端的某些数据,无论您存储数据的方式如何,我可能总是需要使用.而且,它始终是分离关注点的好方法(但伴随着域和DTO对象之间的映射问题,由于弹簧转换器,DTO对象得到了很大程度的发布)
发布于 2018-04-27 13:10:07
有两个选项,一个是update查询,它工作得很好,但您可能会觉得自己正在失去一些hibernate特性和代码的简单性。否则,您可以使用Hibernate的方式,如下所示
AuditorBean auditorBean = (AuditorBean) session.get(AuditorBean.class, AuditorBean.getId());
auditorBean.setFirstName("aa");
auditorBean.setLatName("bb");
auditorBean.setTrainLevel("ISO");
auditorBean.setAccessLevel(4);在这里,您不应该调用像saveOrUpdate()或merge()这样的方法。对象与事务一起附加,因此对象将在事务结束时自动刷新和提交。
https://stackoverflow.com/questions/50005713
复制相似问题