【问题标题】:Copying entities between multiple databases with NHibernate使用 NHibernate 在多个数据库之间复制实体
【发布时间】:2010-09-20 05:44:20
【问题描述】:

我有一个桌面(winforms)应用程序,它使用 Firebird 数据库作为数据存储(在嵌入式模式下),并且我使用 NHibernate for ORM。我们需要支持的功能之一是能够从外部文件导入/导出数据组。目前,这个外部文件也是一个与主数据库具有相同架构的数据库。

我已经设置了 NHibernate 来查看多个数据库,并且我可以同时使用两个数据库。然而,问题在于在两个数据库之间复制数据。我有两种复制策略:(1) 复制对象的所有相同 ID [aka import/export] 和 (2) 复制大部分新 ID [aka duplicate / copy]。我说“大部分是新的”,因为有些查找项将始终使用相同的 ID 进行复制。

使用新 ID 复制所有内容很好,因为我将只有一个“CopyForExport”方法,该方法可以创建所有内容的副本而不分配新 ID(或清除对象树中的所有 ID)。

处理这种情况以及在数据库之间复制数据同时保持相同 ID 的“最佳实践”方法是什么?

澄清:我不想同步两个数据库,只是导出一个子集(用户可选择)或数据以传输给其他人(然后他们会将数据子集导入到他们自己的数据库中)。

进一步澄清:我认为我已将问题归结为: 我想使用 NHibernate 的 ISession.SaveOrUpdate 功能,因此我使用未“分配”的身份生成器设置我的实体。但是,当我想要覆盖生成的标识时(用于在同一进程中的多个数据库之间复制数据)时遇到问题。

有没有办法使用 Guid.Comb 或 UUID 生成器,但有时可以指定我自己的标识符(用于传输到具有相同架构的不同数据库连接)。

【问题讨论】:

    标签: winforms nhibernate


    【解决方案1】:

    我找到了自己问题的答案: 关键是 ISession.Replicate 方法。这允许您在数据存储之间复制对象图并保持相同的标识符。要创建新的标识符,我想我可以使用 ISession.Merge,但我仍然需要验证这一点。

    但有一些注意事项:我的测试类引用了父对象(多对一关系),我必须使类非延迟加载才能使 Replicate 正常工作。如果我没有将它设置为急切加载(我猜是非延迟加载),它只会复制对象而不是父对象(我的 hbm.xml 文件中的 cascade="all")。

    java Hibernate 文档引用了 Replicate(),但 NHibernate 文档没有(java 文档中的section 10.9)。

    这对于复制行为是有意义的,因为我们希望在将实体转移到另一个数据存储之前拥有完全水合的实体。奇怪的是,即使两个会话都打开(每个数据存储一个会话),当我想复制对象时,它并没有考虑对对象进行水合。

    【讨论】:

    • 终于找到了这个解决方案,我也遇到了类似的问题。我想休眠站点当前已关闭并没有帮助。
    【解决方案2】:

    您可以为此使用FBCopy。只需定义要复制的表和列,我就会完成这项工作。您还可以为每个表添加可选的 WHERE 子句,因此它只复制您想要的行。

    在复制时,确保保持导出数据的顺序,这样外键就不会中断。它还支持生成器。

    【讨论】:

      猜你喜欢
      • 2012-01-27
      • 1970-01-01
      • 2013-05-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多