Spring Data Couchbase 在嵌入时将 @Id 属性设置为 json

Spring Data Couchbase put @Id attribute to json when embedded

我有一个一对多的关系,即 A 和 B。A 可以引用许多 B 实例。 B实例也可以独立管理。 这就是为什么 B class 看起来像这样:

public class B {
    @Id
    private String id;
    private String appId;
}

A class 将引用 B 实例列表。所以它看起来像这样:

public class A {
    @Id
    private String id;
    private int age;
    private List<B> bInstances;
}

当 bInstances 填充 B 实例然后保存 A 实例时,B 实例的 id 字段从 JSON 文档中删除,因为它是用 @Id 注释的。 当 B 嵌入另一个 class 时,我只需要将此字段添加到 JSON。 而当B实例独立保存时,@Id字段可以作为正则键。 我该怎么做?

我强烈建议您不要将 B 的实例直接存储在 A 的文档中。如果 B 的实例在另一个实例中发生更改,这样做会导致数据不一致context than A. 此外,如果 B 的实例存储在 class A.

的多个文档中,则您会不必要地复制数据

将一个 class 的实例存储在另一个中的理想方法是保存文档 ID。所以你的 class A 应该是这样的:

public class A {
    @Id
    private String id;
    private int age;
    private List<String> bInstanceIds;
}

具体回答您的问题,是的,注释字段 @Id 不会写入序列化 json。最好的办法是复制该字段并在构造函数或 setter 中设置其值,例如:

public class B {
@Id
private String metaId;
private String id;
private String appId; 

public setMetaId(String metaId) {
    this.metaId = metaId;
    this.id = metaId;
 }
}

如果您不想在序列化中看到重复,可以@JsonIgnore其中之一。

注意:我完全同意罗宾的回答,但有些情况下你想按原样保存数据并且你想在将来参考它..所以你不关心B保存数据一周后实例发生变化。所以这真的取决于你的场景。