Как предотвратить столкновение поля «автонумерация» при экспорте из одной базы данных в другую? - PullRequest
1 голос
/ 16 февраля 2010

Предположим, у меня есть класс Person, который сохраняется / загружается через Hibernate:

class 
{
int PersonId;
String Name;
}

PersonId - это «автоматический номер», который генерируется hibernate при сохранении Person.
Теперь предположим, что я сделал кучу Person в тестовой базе данных, которую теперь хочу скопировать в производственную базу данных.
Но в производственной базе данных уже есть PersonId 1, называемый "Джон" ».
А в тестовой базе данных PersonId 1 - это «Уильям».

Как мне импортировать «Уильям» как PersonId = 2 в производственную базу данных?

Обратите внимание, что будут другие таблицы, в которых PersonId используется в тестовой базе данных, например, таблица адресов и т. Д. Так что все это также необходимо экспортировать / импортировать, сохраняя при этом целостность PersonId ..

EDIT: Я полагаю, что одной из возможностей является то, что тестовая база данных должна быть настроена на использование автономного номера, начиная, скажем, с 90000, тогда как мы знаем, что производственная база данных имеет значения PersonId менее 10000. Таким образом, мы можем «разделить» это таким образом. Но что, если пользователь забыл установить это и теперь застрял с автономными номерами, начинающимися с 1? Пользователь не должен повторять все усилия, просто чтобы изменить идентификаторы, которые в идеале должны делать мои программы.

Ответы [ 2 ]

0 голосов
/ 16 февраля 2010
  1. Получить все Person объекты в List, используя конфигурацию тестовой базы данных
  2. Сериализация этого списка с использованием ObjectOutputStream (или apache commons-lang SerializationUtils) на жесткий диск
  3. Изменение конфигурации дБ для производственной базы данных
  4. Десериализовать List (снова, используя ObjectInputStream или SerializationUtils)
  5. Итерируйте его, чтобы сохранить каждого человека, но перед этим установите идентификатор равным 0:

    for (List<Person> person : personsList){
        person.setId(0);
        em.persist(person);
    }
    
  6. В лучшем случае поместите вышеуказанные функции в отдельную программу, которую можно запускать при необходимости.

0 голосов
/ 16 февраля 2010
Person personToInsert=new Person("William")
personToInsert.save()

Вам лучше написать сценарий, который добавляет надлежащие объекты Hibernate в производственную базу данных, а не пытается использовать дамп SQL из тестовой базы данных. Ваш скрипт может сделать что-то вроде следующего. Получить список всех людей. Для каждого человека в списке создайте новый объект с необходимыми полями, такими как имя, возраст и т. Д. Сохраните этот объект в базе данных. После того, как люди вставлены, добавьте любые объекты, связанные с каждым человеком, такие как информация о сотруднике.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...