2012-12-06 33 views
1

尝试使用FlexJSON序列化JPA/Hibernate实体时出现了一个非常奇怪的错误。对象本身不是什么幻想;只是字段和其他对象之间的关系。Hibernate和FlexJSON的懒惰初始化错误

Caused by: flexjson.JSONException: Error trying to deepSerialize 
    at flexjson.transformer.ObjectTransformer.transform(ObjectTransformer.java:61) 
    at flexjson.transformer.TransformerWrapper.transform(TransformerWrapper.java:22) 
    at flexjson.transformer.ObjectTransformer.transform(ObjectTransformer.java:49) 
    at flexjson.transformer.TransformerWrapper.transform(TransformerWrapper.java:22) 
    at flexjson.transformer.ObjectTransformer.transform(ObjectTransformer.java:49) 
    at flexjson.transformer.TransformerWrapper.transform(TransformerWrapper.java:22) 
    at flexjson.transformer.ObjectTransformer.transform(ObjectTransformer.java:49) 
    at flexjson.transformer.TransformerWrapper.transform(TransformerWrapper.java:22) 
    at flexjson.JSONContext.transform(JSONContext.java:73) 
    at flexjson.JSONSerializer.serialize(JSONSerializer.java:377) 
    at flexjson.JSONSerializer.serialize(JSONSerializer.java:235) 

Caused by: java.lang.reflect.InvocationTargetException 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at flexjson.BeanProperty.getValue(BeanProperty.java:102) 
    at flexjson.transformer.ObjectTransformer.transform(ObjectTransformer.java:37) 
    ... 89 more 
Caused by: java.lang.IllegalStateException: Cannot call isReadOnlyBeforeAttachedToSession when isReadOnlySettingAvailable == true 
at org.hibernate.proxy.AbstractLazyInitializer.isReadOnlyBeforeAttachedToSession(AbstractLazyInitializer.java:308 

从阅读其他(稀疏)的帖子,看看代码看起来像这是一个懒惰的初始化问题。这种情况在很少的情况下反复发生,但这些情况是可重复的。我的猜测是,因为它似乎是有状态的,它与数据有关,但我真的不知道为什么数据会导致这种异常,尤其是因为它非常罕见。

回答

3

也许你的实体对象有一个'lazy loaded'属性,这些属性只有在数据库访问的时候才被填充。如果休眠会话在消毒时已经关闭(访问该属性),您将得到懒惰的初始化异常。

要摆脱这种例外的,你可能需要做以下操作之一:

  • 保证Hibernate的Session没有在访问延迟加载的属性(系列化)的时间
  • INITIALISE关闭在会议召开之前延迟加载的特性是关闭的,这样它就不需要即使在session关闭
  • 让他们不是“懒加载”
  • 完全不
  • 连载延迟加载特性DB访问
+0

我们应该如何去虽然不序列化延迟加载属性? – chrismarx

0

我已经经历过的最好的解决方案是,在执行深度序列化之前,您需要将诸如bean,列表,映射或任何数据的数据序列化到HashMap中,然后尝试深度序列化该HashMap 。你会看到这个技巧正在工作100%。

赛义德·沙赫扎德

相关问题