有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

假设我有一个通过hibernate持久化/加载的Person类:

class 
{
int PersonId;
String Name;
}

PersonId是hibernate在保存Person时生成的“自动编号”
现在让我们假设我在一个测试数据库中做了一堆Person,现在我想复制到生产数据库中
但是,在生产数据库中,已经有一个名为“John”的PersonId1
在测试数据库中,PersonId1是“William”

如何将“William”作为PersonId=2导入生产数据库

请注意,在测试数据库中使用PersonId的还有其他表,如地址表等。因此,在保持PersonId的完整性的同时,还需要导出/导入所有这些表

编辑: 我认为一种可能性是,测试数据库应该配置为从90000开始使用autonumber,而我们知道生产数据库的PersonId值小于10000。所以我们可以这样“分割”它。但如果用户忘记设置,现在只能使用从1开始的自动编号,该怎么办?用户不应该为了更改我的s/w理想情况下应该做的id而重复所有的工作


共 (2) 个答案

  1. # 1 楼答案

    Person personToInsert=new Person("William")
    personToInsert.save()
    

    最好编写一个脚本,将适当的Hibernate对象添加到生产数据库中,而不是尝试使用测试数据库中的SQL转储。您的脚本可能会执行以下操作。列出所有人的名单。为列表中的每个人创建一个新对象,设置必要的字段,如姓名、年龄等。将该对象保存到数据库中。插入人员后,添加与每个人员关联的任何对象,例如员工信息

  2. # 2 楼答案

    1. 使用测试数据库配置获取List中的所有Person对象
    2. 使用ObjectOutputStream(或apache commons lang SerializationUtils)将该列表序列化到硬盘
    3. 更改生产数据库的数据库配置
    4. 反序列化List(同样,使用ObjectInputStreamSerializationUtils
    5. 迭代保存每个人,但在此之前将id设置为0:

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