gpt4 book ai didi

java - 在没有存储库的情况下修改 Spring Data Rest 中的 @OneToMany 实体

转载 作者:搜寻专家 更新时间:2023-10-30 21:32:45 25 4
gpt4 key购买 nike

在我的项目中,我使用 A 类型的对象,它与 B 。我需要 SpringDataRest (SDR) 使用单个 POST 请求来存储完整的 A 对象及其 B 对象(子对象)。我在 SDR 中尝试了几种组合,唯一对我有用的组合是为对象 A 创建@RepositoryRestResource 并为对象 B 创建@RepositoryRestResource,但标记为(B) as exported=false(如果我根本没有从对象 B 创建存储库,它就不会工作 -> 只是 A对象将存储在单个 POST 请求中,但不会存储其 B 类型的子项(@OneToMany 关系);如果 B 存储库省略 exported=false,则会出现相同的结果) . 这可以吗,并且是实现它的唯一方法(一次存储所有对象的单个 POST 请求)?

我问的原因是,在我之前的示例中,我必须(我想)通过使用 A 的存储库来控制所有对象的“生命周期”。我同意,因为 A->B 关系是组合(B 不存在于 A 之外).但是我有一个严重的问题,即通过 SDR 使用其父存储库编辑(也删除)类型为 B 的某个特定对象(因为对象 B 没有导出自己的存储库)。也许,这在定义上是不可能的。我已经尝试过这些解决方案:

  • “/A/1/B/2”的 PATCH 不起作用 -> 方法不允许(在标题中是 "Allow: GET, DELETE") -> 所以,PUT 也不行
  • Json 补丁也不起作用 - 使用 json 补丁为“/A/1”打补丁内容类型 [{"op": "add", "path": "/B/2", ....}] -> "no such index在目标数组中”- 因为 Json Patch 在“数组”之后使用标量“2”作为其数组的索引。这在 Java 世界中是不实用的,当关系保存在一组对象中 - 索引没有意义完全没有。
  • 我可以导出对象 B 的存储库 (exported=true)“直接”操纵它,但这样我就会失去能力在单个 POST 中存储整个对象 A 及其 B 对象正如我之前提到的那样请求。

如果可能的话,我想避免发送整个 A 对象及其 B 对象的一个​​微小修改。谢谢。

最佳答案

我设法按如下方式更改了子实体。作为示例,我使用了以下实体:

@Entity
@Data
@NoArgsConstructor
public class One {

@Id
@GeneratedValue
private Long id;

private String name;

@OneToMany(cascade = ALL)
private List<Many> manies = new ArrayList<>();

}

@Entity
@Data
@NoArgsConstructor
public class Many {

public Many(String name) {
this.name = name;
}

@Id
@GeneratedValue
private Long id;

private String name;
}

我刚刚公开了一个用于One 的存储库。

(我的示例使用优秀的 httpie - CLI HTTP client )

使用 json 补丁删除项目

此示例将删除 manies 列表中的第二项。您可以使用 @OrderColumn 来确保您可以依赖列表项的顺序。

echo '[{"op":"remove", "path":"/manies/1"}]' | http PATCH :8080/ones/1 Content-Type:application/json-patch+json -v

PATCH /ones/1 HTTP/1.1
Content-Type: application/json-patch+json

[
{
"op": "remove",
"path": "/manies/1"
}
]

使用 json 补丁替换整个列表

此示例将列表替换为值中指定的数组。

echo '[{"op":"add", "path":"/manies", "value":[{"name":"3"}]}]' | http PATCH :8080/ones/1 Content-Type:application/json-patch+json -v

PATCH /ones/1 HTTP/1.1
Accept: application/json
Content-Type: application/json-patch+json

[
{
"op": "add",
"path": "/manies",
"value": [
{
"name": "3"
}
]
}
]

使用 json 补丁将项目添加到列表

此示例将一个项目添加到列表的末尾。同样在这里,客户端只需要在更新之前知道列表的长度。所以这里的顺序并不重要。

echo '[{"op":"add", "path":"/manies/-", "value":{"name":"4"}}]' | http PATCH :8080/ones/1 Content-Type:application/json-patch+json -v

PATCH /ones/1 HTTP/1.1
Accept: application/json
Content-Type: application/json-patch+json

[
{
"op": "add",
"path": "/manies/-",
"value": {
"name": "4"
}
}
]

希望这对您有所帮助。

关于java - 在没有存储库的情况下修改 Spring Data Rest 中的 @OneToMany 实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34843297/

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