首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何使用REST和JPA/Hibernate正确更新实体

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

Stack Overflow用户
提问于 2018-04-24 15:37:02
回答 2查看 1.8K关注 0票数 1

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

示例:

代码语言:javascript
运行
复制
Document:
  id,
  title,
  body,
  authors,
  viewers,
  ...

使用REST,我想更新一些特定的文档,控制器接收序列化的文档对象,调用EntityManager的merge方法将空结果持久化到数据库,如果控制器只接收到主体,那么我希望只更新主体,但是合并删除标题、作者和查看器等的记录。

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

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-04-24 16:32:30

对于实体部分更新,您需要使用条件api或jpql .如果您使用的是不允许jpql更新的旧版本的标准更新或旧查询解析器,则必须先从数据库读取,然后再插入.您还可以使用updatable=false来设置只应在创建时设置的列(如CREATION_DATE),而且hibernate中还有一个很好的特性,名为@DynamicUpdate,我还没有尝试过,但是看起来很棒……它只更新修改后的字段(查查弗拉德的帖子) .关于DTO DP,如果您想隐藏/修改客户端的某些数据,无论您存储数据的方式如何,我可能总是需要使用.而且,它始终是分离关注点的好方法(但伴随着域和DTO对象之间的映射问题,由于弹簧转换器,DTO对象得到了很大程度的发布)

票数 3
EN

Stack Overflow用户

发布于 2018-04-27 13:10:07

有两个选项,一个是update查询,它工作得很好,但您可能会觉得自己正在失去一些hibernate特性和代码的简单性。否则,您可以使用Hibernate的方式,如下所示

代码语言:javascript
运行
复制
   AuditorBean auditorBean = (AuditorBean) session.get(AuditorBean.class, AuditorBean.getId());
    auditorBean.setFirstName("aa");
    auditorBean.setLatName("bb");
    auditorBean.setTrainLevel("ISO");
    auditorBean.setAccessLevel(4);

在这里,您不应该调用像saveOrUpdate()或merge()这样的方法。对象与事务一起附加,因此对象将在事务结束时自动刷新和提交。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50005713

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档