Spring Data Couchbase在嵌入时将@Id属性放入json

时间:2017-09-27 11:35:14

标签: spring spring-data couchbase spring-data-couchbase

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

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

一个类将引用B实例列表。所以它看起来像这样:

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

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

2 个答案:

答案 0 :(得分:0)

我强烈建议您直接将B的实例存储在A的文档中。如果B的实例在另一个上下文中被更改,则会导致数据不一致。如果B的实例存储在A类的多个文档中,则会不必要地复制数据。

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

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

答案 1 :(得分:0)

要具体回答您的问题,是注释@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其中一个。

注意:我完全同意Robin的回答,但是有些情况下您希望保存数据,并且您希望将来引用它...所以您不关心B实例是否已更改保存数据一周后。所以这取决于你的情况。