【问题标题】:Merge two databases with identical structure and Hibernate mappings合并两个具有相同结构和 Hibernate 映射的数据库
【发布时间】:2011-05-10 12:54:59
【问题描述】:

以下情况:

我有两个具有相同结构的数据库。在这些数据库中的每一个之上运行一个使用 Hibernate for ORM 的同一应用程序的实例。两者完全独立。

现在我必须将两个应用程序合并为一个。在某些表中,需要进行调整以避免违反唯一键约束。

由于两个数据库在结构上相同并且使用相同的 Hibernate 映射,有没有办法使用 Hibernate 来完成任务?我正在考虑从数据库 A 加载一个对象,在代码中对其进行修改,然后简单地将其从基于数据库 B 的 SessionFactory 保存到一个 Session 中。我想知道 Hibernate 是否能够相应地更新主键和外键值和处理未从数据库 A 复制的对象的依赖关系会有多困难(因为不再需要它们)。

有什么建议吗?

【问题讨论】:

    标签: java mysql hibernate


    【解决方案1】:

    只从数据库 A 进行数据库转储并将其导入数据库 B 不是更容易吗?或者作为替代使用insert into B.table (col1,col2) values (select col1,col3 from A.table)

    【讨论】:

    • 这是不可能的,因为存在唯一的键约束。一些条目也必须合并为一个,而其他条目将保持独立。
    【解决方案2】:

    如果您的数据库是 MySQL,则使用 MERGE 存储引擎。步骤如下:

    -在您的一个数据库中,使用级联 all 通过 Hibernate 更新您的所有 id。您的所有 id 必须由每个表上其他数据库的最后一个 id 递增:

    User1(2000 行,lastId:2000)和 User2(3000 行,lastId:3000)-> User1(2000 行,lastId:2000)和 User2(3000 行,firstId:3000,lastId:6000)

    -创建一个合并所有数据库的其他数据库

    -从新数据库中提取转储并将此转储加载到最终数据库中-> http://dev.mysql.com/doc/refman/5.0/en/merge-storage-engine.html

    这是一种可能的方式:)

    【讨论】:

    • 这是不可能的,因为存在唯一的键约束。一些条目也必须合并为一个,而其他条目将保持独立。 ;-)
    【解决方案3】:

    我知道这是一个旧线程,但我遇到了类似的问题。

    我解决了在我的表中包含两个日期字段:included_datechanged_date,而且,我还包含另一个字段来保存我上次在其他地方同步数据库的日期(我有一个包含配置信息的表)。

    当我的系统连接到服务器时,我发送上次同步的日期,然后我的例程可以比较自上次同步以来包含或更改了哪些行。

    每个新行我都会在included_date 字段中设置日期,所以当我同步时我知道在我上次同步之后创建了哪些行,然后我可以执行INSERT。行更改和changed_date 字段也会发生同样的情况,然后我执行UPDATE

    【讨论】:

      猜你喜欢
      • 2013-03-24
      • 1970-01-01
      • 2013-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-30
      • 1970-01-01
      相关资源
      最近更新 更多