【问题标题】:How do I serialize/deserialize a NHibernate entity that has references to other objects?如何序列化/反序列化引用其他对象的 NHibernate 实体?
【发布时间】:2010-05-07 04:21:18
【问题描述】:

我有两个 NHibernate 管理的实体,它们具有双向的一对多关系:

public class Storage
{
    public virtual string Name { get; set; }
    public virtual IList<Box> Boxes { get; set; }
}

public class Box
{
    public virtual string Box { get; set; }
    [DoNotSerialize] public virtual Storage ParentStorage { get; set; }
}

一个Storage 可以包含许多Boxes,一个Box 总是属于一个Storage。我想编辑 Box's 名称,所以我使用 JSON 将其发送到客户端。请注意,我不会序列化 ParentStorage,因为我不会更改它所在的存储空间。

客户端编辑名称并将Box 作为 JSON 发送回。服务器将其反序列化回Box 实体。

问题是,ParentStorage 属性为空。当我尝试将Box 保存到数据库时,它会更新名称,但也会删除与Storage 的关系。

如何正确序列化和反序列化像 Box 这样的实体,同时将 JSON 数据大小保持在最低限度?

【问题讨论】:

    标签: nhibernate serialization orm entity-relationship object-graph


    【解决方案1】:

    我建议您向客户端发送DTO 以进行显示(并且它应该包含唯一的数据库 ID)。然后将 boxId + 新名称从客户端发送回服务器(无需将整个 DTO 发送回去)。服务器可以使用 ID 进行数据库查找以获取盒子对象,将名称字段更新为客户端发送的字段,并将盒子保存到数据库中。

    在这种情况下不需要序列化 ​​NHibernate 对象,这只会增加很多复杂性并且没有任何价值。

    【讨论】:

      【解决方案2】:

      我猜 ParentStorage 是空的,因为它是被延迟加载的。将其配置为急切获取或通过在序列化之前调用 getter 来强制读取可能有助于确保存储已序列化,并且取决于您的 ID 方案,这可能有效(我不确定)。

      在这种情况下,序列化的收益似乎微乎其微,并且随着 Box 和 Storage 类的发展可能会产生意想不到的后果。为名称发送单个字符串、加载 Box、设置字符串并保存该对象似乎更简单。这样您就不必担心 Hibernate 在底层所做的优化。

      【讨论】:

      • 错了,延迟加载的关系不为空,它们是分配给代理的。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-27
      • 2011-09-26
      • 2016-07-09
      相关资源
      最近更新 更多