I have an Entity with a OneToOne relation that is fetched lazily:
我有一个实体与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;
}
This is the test I do, trying to get all the entities and to serialize them as JSON, using the JSONUtil class in JSONPlugin (the 'official' json plugin for Struts 2):
这是我的测试,试图获取所有实体并将它们序列化为JSON,使用JSONPlugin中的JSONUtil类(Struts 2的'官方'json插件):
List<Person> people = personService.findAll();
String result = JSONUtil.serialize(people);
System.out.println(result);
And this is the exception I get (the same exception when I use this plugin with a Struts2 Action and the @JSON annotation):
这是我得到的异常(当我使用带有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)
...
I am using Hibernate and the same code above works when I change fetch=FetchType.EAGER. I think lazy loading generates a proxy-object, and that makes it fail.
我正在使用Hibernate,当我更改fetch = FetchType.EAGER时,上面的代码也能正常工作。我认为延迟加载会生成一个代理对象,这会使它失败。
My question is : Is it possible to serialize objects that contain lazily loaded attributes ?
我的问题是:是否可以序列化包含延迟加载属性的对象?
2 个解决方案
#1
I had the same problem while using JSON-lib, and it is indeed because the object is a proxy.
我在使用JSON-lib时遇到了同样的问题,确实是因为该对象是一个代理。
I found Google-Gson handles serialization of Hibernate objects better, but of course it has its own quirks, so your mileage may vary.
我发现Google-Gson更好地处理了Hibernate对象的序列化,但当然它有自己的怪癖,所以你的里程可能会有所不同。
#2
Detach the Entities from the Hibernate & then serialize them.
从Hibernate中分离实体,然后将它们序列化。
#1
I had the same problem while using JSON-lib, and it is indeed because the object is a proxy.
我在使用JSON-lib时遇到了同样的问题,确实是因为该对象是一个代理。
I found Google-Gson handles serialization of Hibernate objects better, but of course it has its own quirks, so your mileage may vary.
我发现Google-Gson更好地处理了Hibernate对象的序列化,但当然它有自己的怪癖,所以你的里程可能会有所不同。
#2
Detach the Entities from the Hibernate & then serialize them.
从Hibernate中分离实体,然后将它们序列化。