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保存数据一周后实例发生变化。所以这真的取决于你的场景。
我有一个一对多的关系,即 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保存数据一周后实例发生变化。所以这真的取决于你的场景。