【问题标题】:Lazy Initialization Error with Hibernate and FlexJSONHibernate 和 FlexJSON 的延迟初始化错误
【发布时间】:2012-12-06 18:47:22
【问题描述】:

我在尝试使用 FlexJSON 序列化 JPA/Hibernate 实体时遇到一个非常奇怪的错误。对象本身并不花哨;只是其他对象之间的字段和关系。

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

通过阅读其他(稀疏)帖子并查看代码,这似乎是延迟初始化的问题。这种情况在极少数情况下会重复发生,但这些情况是可重复的。我的猜测是因为它似乎是有状态的,它与数据有关,但我真的不知道为什么数据会导致这种异常,特别是因为它是如此罕见。

【问题讨论】:

    标签: java hibernate jpa lazy-loading flexjson


    【解决方案1】:

    您的实体对象可能具有“延迟加载”属性,这些属性仅在访问时才填充数据库中的值。如果休眠会话在灭菌时已经关闭(访问该属性),您将获得延迟初始化异常。

    要消除此异常,您可能必须执行以下操作之一:

    • 确保在访问延迟加载的属性(序列化)时没有关闭休眠会话
    • 在会话关闭之前初始化延迟加载的属性,这样即使会话关闭也不需要数据库访问
    • 使它们不会“延迟加载”
    • 根本不序列化延迟加载的属性

    【讨论】:

    • 我们应该如何不序列化延迟加载属性呢?
    【解决方案2】:

    我经历过的最好的解决方法是,在进行深度序列化之前,您需要将 bean、列表、映射或任何要序列化的数据等数据放入 HashMap,然后尝试深度序列化该 HashMap。你会看到诀窍是 100% 奏效的。

    赛沙扎德

    【讨论】:

      猜你喜欢
      • 2014-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多