繁体   English   中英

如何使用 REST 和 JPA/Hibernate 正确更新实体

[英]How to properly update entities using REST and JPA/Hibernate

我有实体文档,它有很多列,一对一、一对多和多对多映射到其他一些实体。

例子:

Document:
  id,
  title,
  body,
  authors,
  viewers,
  ...

使用 REST,我想更新一些特定的文档,控制器接收序列化的 Document 对象,如果控制器仅接收到 body ,则调用 EntityManager 的合并方法将空结果持久化到数据库中,然后我希望仅更新正文,但合并删除记录标题、作者和观众等。

我知道这是 EntityManager 的标准行为,但我问的是在不从前端或其他端点接收整个实体的情况下对实体进行更新的最首选技术是什么。 我应该使用收到的 id 从数据库加载实体并手动设置所有字段,然后保存到数据库还是应该使用其他技术。

我手动编写所有设置器来复制更改没有任何问题,但实体的大小确实很大,有很多关系。 在这种情况下寻求最佳实践。

我了解 DTO,但在将实体用于控制器和服务方法时,我想要替代方法。

对于实体部分更新,您将需要使用标准 api 或 jpql ...再次....您还可以将updatable=false用于只应在创建时设置的列(如 CREATION_DATE),并且休眠中还有一个不错的功能,称为@DynamicUpdate ,我没有尝试过,但看起来很棒.. . 它只更新修改后的字段( 在此处查看 Vlad 的帖子)...关于 DTO DP,如果您想隐藏/修改客户端的某些数据,无论您存储数据的方式如何.. . 并且它始终是分离关注点的好方法(但伴随着域和 DTO 对象之间的映射问题,这要归功于spring 转换器

有两种选择,一种是更新查询,它运行良好,但您可能会觉得失去了一些休眠功能和代码的简单性。 否则,您可以像下面这样以休眠方式执行此操作

   AuditorBean auditorBean = (AuditorBean) session.get(AuditorBean.class, AuditorBean.getId());
    auditorBean.setFirstName("aa");
    auditorBean.setLatName("bb");
    auditorBean.setTrainLevel("ISO");
    auditorBean.setAccessLevel(4);

此处不应调用任何方法,如 saveOrUpdate() 或 merge()。 对象与事务相关联,因此对象会在事务结束时自动刷新和提交。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM