0

遅延フェッチされる OneToOne 関係を持つエンティティがあります。

@Entity
public class Person {
    @Id
    private Integer id;

    @Column(length=60)
    private String address;

    @OneToOne(fetch=FetchType.LAZY)
    @JoinColumn(name="idProvince")
    private Province province;
}

これは、 JSONPlugin (Struts 2 の「公式」json プラグイン) のJSONUtil クラスを使用して、すべてのエンティティを取得し、それらを JSON としてシリアル化しようとする、私が行うテストです。

    List<Person> people = personService.findAll();
    String result = JSONUtil.serialize(people);
    System.out.println(result);

そして、これは私が得る例外です (このプラグインを Struts2 アクションと @JSON アノテーションで使用した場合と同じ例外です):

com.googlecode.jsonplugin.JSONException: java.lang.IllegalAccessException:
Class com.googlecode.jsonplugin.JSONWriter can not access a member of class 
org.postgresql.jdbc4.AbstractJdbc4Statement with modifiers "public"
    at com.googlecode.jsonplugin.JSONWriter.bean(JSONWriter.java:237)
    at com.googlecode.jsonplugin.JSONWriter.process(JSONWriter.java:159)
    at com.googlecode.jsonplugin.JSONWriter.value(JSONWriter.java:125)
    at com.googlecode.jsonplugin.JSONWriter.array(JSONWriter.java:407)
    at com.googlecode.jsonplugin.JSONWriter.process(JSONWriter.java:149)
    at com.googlecode.jsonplugin.JSONWriter.value(JSONWriter.java:125)
    at com.googlecode.jsonplugin.JSONWriter.write(JSONWriter.java:93)
    at com.googlecode.jsonplugin.JSONWriter.write(JSONWriter.java:76)
    at com.googlecode.jsonplugin.JSONUtil.serialize(JSONUtil.java:62)
    ...

私は Hibernate を使用しており、fetch=FetchType.EAGER を変更すると上記と同じコードが機能します。遅延読み込みはプロキシオブジェクトを生成し、それが失敗すると思います。

私の質問は:遅延ロードされた属性を含むオブジェクトをシリアル化することは可能ですか?

4

2 に答える 2

1

Hibernate からエンティティを切り離し、それらをシリアル化します。

于 2011-06-21T08:52:12.533 に答える
1

JSON-lib を使用しているときに同じ問題が発生しましたが、実際にはオブジェクトがプロキシであるためです。

Google-Gsonは Hibernate オブジェクトのシリアル化をより適切に処理することがわかりましたが、もちろん独自の癖があるため、マイレージは異なる場合があります。

于 2009-02-11T18:27:16.550 に答える