0

親/子参照を使用してオブジェクト グラフをシリアル化しようとしています。基本的に、次のようなエンティティがあります。

@Entity (name = "Container")
@JsonIdentityInfo(generator=JSOGGenerator.class)
public class Container {
    public String type = "parent";

    @JsonManagedReference ("child")
    @OneToMany (mappedBy = "parent", cascade = CascadeType.PERSIST)
    public List<Child> children;
}

@Entity (name = "Child")
@JsonIdentityInfo(generator=JSOGGenerator.class)
public class Child {
    public String type = "child";

    @JsonBackReference ("child")
    @ManyToOne
    public Parent parent;
}

これをクライアントにシリアル化しようとすると、次のようになります。

{
    "type": "parent",
    @id: 1
    "children": [
        {
            "type": "child",
            @id: 2
        },
        { ... }
    ]
}

すべてのオブジェクトのプロパティが表示@idされますが、プロパティがまったく表示されません@ref。jsog と jsog-jackson を正しく理解していれば、実際にシリアル化する必要があるのは次のとおりです。

{
    "type": "parent",
    @id: 1
    "children": [
        {
            "type": "child",
            @id: 2
            @ref: 1
        },
        { ... }
    ]
}

私が本当にしたいのは、ブラウザーでシリアル化された JSOG を復元した後、元の後方参照を親に復元する方法です。これにより、各オブジェクトのプロパティ@refを取得する代わりに元に戻すことができます。parentchild

4

1 に答える 1

4

循環関係を管理するために 2 つの相反するアプローチを使用しています。JSOGGeneratorまたは@JsonManagedReference および @JsonBackReference アノテーションを使用できます。

JSOGGenerator には、JavaScript などの別の言語でオブジェクトを逆シリアル化するのに役立つ JSON シリアル化形式の @id プロパティと @ref プロパティが含まれます。

@JsonManagedReference と @JsonBackReference は、Java クラス情報を使用して循環参照を識別します。その後、その情報は JSON シリアライズ形式から除外されるため、必要な情報が欠落しているため、JavaScript などの別の言語はオブジェクトをデシリアライズできません。

JSOGGenerator のもう 1 つの利点は、制限された親子関係ではなく、深くネストされた循環関係を処理できることです。

于 2016-12-01T15:27:06.910 に答える