2011-05-10 88 views
1

以下情况:合并具有相同结构和休眠映射的两个数据库

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

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

既然两个数据库在结构上都相同,并且使用了相同的Hibernate映射,那么是否有一种方法可以使用Hibernate来完成任务?我想从数据库A加载一个对象,在代码中修改它,并简单地从基于数据库B的SessionFactory保存到Session。我想知道Hibernate是否能够相应地更新主键和外键值,处理从数据库A复制的对象的依赖性是多么困难(因为它们不再需要)。

有什么建议吗?

回答

0

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

+0

这是不可能的,因为存在唯一的关键约束。有些条目也必须合并成一个,而其他条目将保持独立。 – Lunikon 2011-05-10 13:20:08

0

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

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

User1(2000 rows,lastId:2000)and User2(3000 rows,lastId:3000) - > User1(2000 rows,lastId :2000)和用户2(3000行,firstId:3000,lastId:6000)

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

-extract转储从您的新的数据库,并在你的最后装载该转储数据库 - >http://dev.mysql.com/doc/refman/5.0/en/merge-storage-engine.html

这是一种可能的方法:)

+1

这是不可能的,因为存在唯一的关键约束。有些条目也必须合并成一个,而其他条目将保持独立。 ;-) – Lunikon 2011-05-10 19:43:08

0

我知道这是一个古老的线程,但我有一个类似的问题。我解决了包括两个日期字段:included_datechanged_date我的表,并且,我还包括另一个字段来保存我最后同步数据库的其他地方(我有一个表与配置信息)的日期。

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

每一个新行我将日期设置到included_date字段中,所以当我同步时我知道哪些行是在我上次同步后创建的,那么我可以执行INSERT。行更改和changed_date字段也是一样,然后我执行UPDATE