【问题标题】:Hibernate and serialization休眠和序列化
【发布时间】:2011-07-06 13:18:04
【问题描述】:

在我们的应用程序中,我们有双重持久性。首先,实体可以在线保存在 MySQL DB 中(我们使用的是 Hibernate),其次,实体可以通过序列化保存在本地。

我所说的实体是User 类的对象,其中包含一个KnowledgeBase 对象,而KnowledgeBase 包含两个实体列表(List<Card>List<Deck>)。

两种持久性单独工作都很好,但是当我尝试反序列化从数据库加载的序列化 User 对象时会出现问题,即至少已经通过 Hibernate 一次(实际上是两次) .

我注意到KnowledgeBase 中的ArrayListPersistentBag 替换。这可能是我问题的根源吗?

另一个猜测可能是延迟加载会导致这些麻烦......有没有办法告诉 Hibernate 在某个时候完全加载一个对象? (除了急切加载...)

【问题讨论】:

    标签: java hibernate serialization


    【解决方案1】:

    是的,Hibernate.initialize(..) 初始化对象和集合。

    然后,如果需要,您可以使用复制构造函数将集合替换为常规的 java.util 集合:setList(new ArrayList(list))

    【讨论】:

    • 它确实是初始化对象和集合,但它保留了 Hibernate 专有的集合类型。我们在使用 XStream 编组/解组 Hibernate 加载的对象时遇到了这个问题。有没有比仅仅将 Hibernate 加载的对象重新加载到相同类型的正常实例化对象中更好的方法?
    • 谢谢!下次我必须使用 XStream 将 Hibernate 加载的实体编组为 XML 时,我肯定会使用它。
    • @Olaf btw,我相信 PersistentBag 也应该支持很好的序列化,如果会话在那里并且集合被初始化
    • Hibernate.initialize() 会递归地初始化集合和实体吗?例如,如果一个集合包含具有自己集合的实体?那些会被初始化吗?
    • 嗯。目前gettin LazyInitializationException 因为一个集合里面的一个集合的元素里面的一个实体。
    猜你喜欢
    • 2011-12-27
    • 1970-01-01
    • 1970-01-01
    • 2016-05-04
    • 1970-01-01
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多