2009-01-15 33 views
0

我有一个OneToOne关系的实体被延迟加载:Struts2的JSON插件无法与“懒”的数据工作

@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的行动和@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。 我认为延迟加载生成一个代理对象,并使其失败。

我的问题是:是否可以序列化包含延迟加载属性的对象?

回答

1

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

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

1

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