gpt4 book ai didi

json - JAX-RS + JPA,如何只更新/合并实体字段的一个子集?

转载 作者:行者123 更新时间:2023-12-02 03:17:19 26 4
gpt4 key购买 nike

假设我有以下实体:

@Entity
@XmlRootElement
@XmlAccessorType( XmlAccessType.FIELD)
public class MyEntity {

@Id
@GeneratedValue
private long id;

private boolean field1;

private boolean field2;

private boolean field3;
}

假设我有一个 REST Web 服务,允许客户端将部分或完整更新发布到 MyEntity 资源。也许方法签名看起来像这样:

@POST
@Path("{id}")
public Response postMyEntity(@PathParam("id") long id, MyEntity myEntity)

以下是客户端可能用于仅更新 ID 为 101 的 MyEntity 的“field2”的 JSON:

{
"id": 101
"field2": true
}

如果 JPA 知道在反序列化过程中只设置了 field2,那么我很乐意使用如下简单的代码来保持此更改:

entityManager.merge(myEntity);

但是,此操作会更新 field1、field2 和 field3。

人们通常如何确保只有来自 REST 请求的 JSON/XML 中明确指定的字段才会在数据库中更新?我读过有人在他们的网络服务中使用 DTO(而不是实体本身)并手动找出需要在相应实体上设置哪些字段......但是,这个用例似乎很常见,我很惊讶这将需要一种 DIY 方法。

最佳答案

也许有更好的解决方案,但我决定强制我的 REST 服务生成和使用 DTO 而不是实体。我的 DTO 类从不使用基元(整数而不是 int),这确保如果客户端省略 JSON/XML 属性,则相应的 DTO 字段将为空。

当我收到更新资源的 POST 时,我:

  1. 从数据库中获取对应的Entity。
  2. 将所有非空字段从 DTO 复制到实体。
  3. 使用 JPA 的合并功能更新数据库。

当我收到资源的 GET 时,我:

  1. 从数据库中获取实体。
  2. 将实体中的所有字段复制到新的 DTO。
  3. 将 DTO 返回给客户。

设置它很乏味,因为它需要我:

  1. 创建一堆与对应的实体类几乎相同的 DTO 类。
  2. 编写逻辑以在 DTO 和实体之间进行转换。
  3. 继续保持这种困惑局面。

我想我可以从我的实体类中删除原语并向这些字段添加非空约束,而不是使用 DTO。但是,我在几个地方读到将实体类直接暴露给 REST 客户端是一个“坏主意”。所以我继续使用 DTO 解决方案,尽管我不是它的忠实拥护者。

关于json - JAX-RS + JPA,如何只更新/合并实体字段的一个子集?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35923428/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com