7

LAZYの読み込みを維持し、POJOオブジェクトの代わりにidを使用してオブジェクトを逆シリアル化する方法はありますか?

多対多の関係で参加している2つのクラスがあります。

このようなもの

public class User {
    @Id
    @JsonProperty
    public long id;

    @ManyToMany(
            fetch = FetchType.EAGER,
    )
    @JoinTable(
            name = "User_EntityType",
            joinColumns = @JoinColumn(name = "user_id"),
            inverseJoinColumns = @JoinColumn(name = "type_id")
    )
    @JsonProperty
    public Set<Type> types;

}

public class Type {
    @Id
    @JsonProperty
    public long id;

    @ManyToMany(
            fetch = FetchType.EAGER,
            mappedBy = "types",
            targetEntity = User.class
    )
    @JsonProperty
    public Set<User> users;
}

データ型は問題なく機能します。hibernateを使用して問題なく書き込みと読み取りを行うことができます。

ただし、REST APIを使用してUserオブジェクトを返すことができるようにしたいので、Jacksonを使用して逆シリアル化します。問題は、それを行うと、他のTypeオブジェクトを含むUserオブジェクトのすべてのTypeが逆シリアル化され、大きな混乱が生じることです。

代わりに、SetofTypeの代わりにSetofLongタイプIDを返すことは可能ですか?

4

2 に答える 2

4

はい、Jackson 2.0 を Object Identity 機能で使用している場合は可能です。

クラスに注釈を付けると、@JsonIdentityInfoJackson はオブジェクトを 1 回だけ出力します。以降の参照では、代わりに ID が使用されます。したがって、タイプが一度出力されている限り、一連のタイプは ID としてシリアル化されます。Jackson を逆シリアル化すると、ID がオブジェクトに戻されます。

あなたの場合、次のように Type クラスに注釈を付ける必要があると思います。

@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class, property="id")
public class Type {
    ...
}

この機能の使用方法の詳細については、http://wiki.fasterxml.com/JacksonFeatureObjectIdentityを参照してください。

于 2012-10-17T03:37:54.310 に答える
0

Jackson のオブジェクト マッパーを使用して Hibernate エンティティをシリアル化し、提供する必要がある JAX-RS エンドポイントでも、この問題に直面していました。@JsonIgnoreまたはのようなソリューションを使用@JsonIdentityInfo(generator=ObjectIdGenerators.PropertyGenerator.class,...するオプションは、私にとってはオプションではありませんでした.

したがって、私の解決策は、実際のシリアル化を行う前に、マッパーに次のフラグを設定することでした:

ObjectMapper objMapper = new ObjectMapper();
objMapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

この方法では、リレーショナル オブジェクトに値を設定する試みはなく、代わりに ID がそのまま残されるためfetch = FetchType.LAZY、リレーショナル フィールドにフラグを保持することができました。

于 2015-03-27T23:46:13.583 に答える