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;
}

这是我做的测试,尝试获取所有实体并将它们序列化为 JSON,使用 JSONPlugin 中的 JSONUtil 类 Struts 2 的“官方”json 插件):

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

这是我得到的异常(当我将此插件与 Struts2 Action 和 @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

我在使用 JSON-lib 时遇到了同样的问题,这确实是因为该对象是一个代理。

我发现Google-Gson更好地处理 Hibernate 对象的序列化,但当然它有自己的怪癖,所以你的里程可能会有所不同。

于 2009-02-11T18:27:16.550 回答
1

从休眠中分离实体然后序列化它们。

于 2011-06-21T08:52:12.533 回答