Java 如何防止“冲突”;“自动编号”;从一个数据库导出到另一个数据库时的字段?

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导入生产数据库 请注意

假设我有一个通过hibernate持久化/加载的
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 lang
    SerializationUtils
    )将该列表序列化到硬盘
  • 更改生产数据库的数据库配置
  • 反序列化
    列表
    (再次使用
    ObjectInputStream
    SerializationUtils
  • 迭代保存每个人,但在此之前将id设置为0:

    for (List<Person> person : personsList){
        person.setId(0);
        em.persist(person);
    }
    
    for(列表人:personsList){
    person.setId(0);
    em.person;
    }
    
  • 最好将上述功能放在一个单独的程序中,您可以在需要时运行该程序