3

稍微简化的示例情况:我有实体 A 和 B,它们是令人难以置信的“重”域对象。从数据库中加载一个非常重要。然后我有一个实体 C,它是一个非常简单的对象,它有一个标签字符串、一个 A 和一个 B——都是惰性的。

我正在做一些低级查询来创建巨大的 C 列表,所以我确切地知道我需要为 CA 和 CB 保存哪些 ID,但我不想加载整个对象并将它们设置为属性,因为开销是疯狂的。

相反,我只想将 ID 直接插入到我的 C 实体中,然后仅在需要时才完全加载其上的 A 和 B 属性。

我在文档中看到了<sql-insert/>标签,但该部分真的很稀疏。

有什么方法可以在 NHibernate 框架内做我想做的事情,还是应该只做原始 SQL?如果可能的话,我试图保持数据库的可移植性,这让我回避了原始选项。似乎必须有一个更好的方法我错过了。

4

2 回答 2

1

我不知道 NHibernate 是否允许这样做(在相同的基础数据上分离对象),但通常我会制作“摘要”对象,这些对象可以上转换为成熟的对象(即使对成熟的对象进行延迟加载)。我通常使用代码生成或手动 ORM 层来执行此操作。

大型集合通常是摘要,然后如果摘要未公开所需的属性或方法,则将它们上转换为完整的对象以供调用或传递等。

于 2008-10-20T00:15:08.837 回答
1

丹——不确定这是否会在没有测试的情况下工作,但值得一试。我猜你已经有了要添加到 C 中的 ID - 所以将你的关联(我假设是多对一)设置为 insert="false" 和 update="false" (可能是 cascade="none " 也可以使用)。然后创建 A 和 B 实体的“空副本”,将 Id 添加到它们,将它们添加到 C 并尝试保存 C (Session.SaveOrUpdateCopy(C))。希望 NHibernate 不会尝试将新的 A 和 B 对象添加到各自的表中,而只是在 C 表中设置正确的 Id——这样您就不必加载 A 和 B 实体。

不好的部分是,如果您必须保存或更新 A 和 B,则必须直接进行。另一个不好的部分是我没有时间测试这个,所以我不知道它是否会起作用。

于 2008-10-20T14:38:00.203 回答