首页 文章

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

提问于
浏览
1

我有一对多的关系,即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

    要具体回答您的问题,是注释 @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实例是否在一周之后改变了你保存了数据 . 所以它真的取决于你的情况 .

  • 0

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

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

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

相关问题