Java 如何防止“冲突”;“自动编号”;从一个数据库导出到另一个数据库时的字段?
假设我有一个通过hibernate持久化/加载的Java 如何防止“冲突”;“自动编号”;从一个数据库导出到另一个数据库时的字段?,java,hibernate,orm,export,Java,Hibernate,Orm,Export,假设我有一个通过hibernate持久化/加载的Person类: class { int PersonId; String Name; } PersonId是一个“自动编号”,在保存人员时由hibernate生成 现在让我们假设我在一个测试数据库中创建了一组Person,我现在想复制到生产数据库中。但是,在生产数据库中,已经有一个名为“John”的PersonId。 在测试数据库中,PersonId1是“William”。如何将“William”作为PersonId=2导入生产数据库 请注意
Person
类:
class
{
int PersonId;
String Name;
}
PersonId
是一个“自动编号”,在保存人员时由hibernate生成
现在让我们假设我在一个测试数据库中创建了一组Person
,我现在想复制到生产数据库中。
但是,在生产数据库中,已经有一个名为“John”的PersonId
。
在测试数据库中,PersonId
1是“William”。
如何将“William”作为PersonId
=2导入生产数据库
请注意,测试数据库中将使用PersonId
的其他表,如地址表等。因此,在维护PersonId
的完整性的同时,还需要导出/导入所有这些表
编辑:
我认为一种可能性是,测试数据库应该配置为从90000开始使用autonumber,而我们知道生产数据库的PersonId值小于10000。所以我们可以这样“分割”它。但是,如果用户忘记设置,现在只能使用从1开始的自动编号,该怎么办?用户不必重复我的s/w理想情况下应该做的所有更改id的工作
Person personToInsert=new Person("William")
personToInsert.save()
最好编写一个脚本,将适当的Hibernate对象添加到生产数据库中,而不是尝试使用测试数据库中的SQL转储。您的脚本可能会执行以下操作。得到所有人的名单。为列表中的每个人创建一个新对象,设置必要的字段,如姓名、年龄等。将该对象保存到数据库中。插入人员后,添加与每个人员关联的任何对象,例如员工信息
使用测试数据库配置获取列表中的所有Person
对象
使用ObjectOutputStream
(或apache commons langSerializationUtils
)将该列表序列化到硬盘
更改生产数据库的数据库配置
反序列化列表
(再次使用ObjectInputStream
或SerializationUtils
)
迭代保存每个人,但在此之前将id设置为0:
for (List<Person> person : personsList){
person.setId(0);
em.persist(person);
}
for(列表人:personsList){
person.setId(0);
em.person;
}
最好将上述功能放在一个单独的程序中,您可以在需要时运行该程序