Как обновить схему базы данных, не теряя свои данные с Hibernate?

Этот вопрос очень старый & ndash; Я просто наткнулся на это сегодня ... ... и задался вопросом, почему никто не дал этот ответ раньше ...

Я думаю, это возможно сделать в C ++ 11, как это делает Python (под капюшон):

#include 
using namespace std;

int main()
{
  int a = 4, b = 5;
  cout << "Before assignment: a: " << a << ", b: " << b << endl;
  pair ba(b, a);
  ba = make_pair(a, b); // <===: (b, a) = (a, b)
  cout << "After assignment : a: " << a << ", b: " << b << endl;
  return 0;
}

Я попробовал это на ideone.com . Вывод был:

Before assignment: a: 4, b: 5
After assignment : a: 5, b: 4

Если я правильно помню (я не эксперт Python), в Python a, b обозначает пару. ( Python Doc .: 5.3. Кортежи и последовательности )

Такая пара может быть выполнена на C ++ 11 легко, например. с std::pair . В этом случае я сделал пару ссылок и назначил пару значений. Он работает, когда make_pair() загружает обе переменные, прежде чем правая пара (значений) будет назначена левой паре ссылок.

Прокрутка снова, я понимаю, что этот ответ близок к решению, основанному на повышении Йоханнес отвечает .

Может быть, причина в том, что он не работал на C ++ 03. Я пробовал в coliru.stacked-crooked.com: С -std=c++03 он дает ужасное читать ошибки компилятора & ndash; изменяясь на -std=c++11, и он компилирует и выполняет тонкие, как описано выше.

Отказ от ответственности

Я просто не могу представить, какое это решение подходит, и то, что он может иметь. Это не то, что я пытался сделать. Как и многие другие ответы, «это не работает». ИМХО это делает (правильно написано в соответствии с языком C ++) ...

24
задан artemb 10 April 2009 в 15:29
поделиться

8 ответов

LiquiBase - ваш лучший выбор. Он имеет режим интеграции hibernate , который использует hbm2ddl Hibernate для сравнения вашей базы данных и вашего отображения hibernate, но вместо автоматического обновления базы данных он выводит файл журнала изменений в liquibase, который можно проверить перед фактическим запуском.

Хотя это и удобнее, любой инструмент, который выполняет сравнение вашей базы данных и ваших отображений гибернации, может ошибаться. См. http://www.liquibase.org/2007/06/the-problem-with-database-diffs.html для примеров. С помощью liquibase вы создаете список изменений базы данных по мере разработки в формате, который может выдержать код с ответвлениями и слияниями.

17
ответ дан Jonathan Leitschuh 10 April 2009 в 15:29
поделиться

Вы можете использовать https://github.com/Devskiller/jpa2ddl инструмент, который предоставляет плагин Maven и Gradle и способен генерировать автоматические миграции схемы для Flyway на основе сущностей JPA , Сюда также входят все свойства, диалекты, пользовательские типы, стратегии именования и т. Д.

4
ответ дан Jakub Kubrynski 10 April 2009 в 15:29
поделиться

Я лично отслеживаю все изменения в сценарии миграции SQL.

3
ответ дан Maurice Perry 10 April 2009 в 15:29
поделиться
3
ответ дан Blake Pettersson 10 April 2009 в 15:29
поделиться

Я использую задачу муравья hbm2ddl для генерации моего ddl. Существует опция, которая будет выполнять изменение таблиц / столбцов в вашей базе данных.

Пожалуйста, смотрите атрибут «update» задачи муравья hbm2ddl:

http://www.hibernate.org/hib_docs/tools/reference/en/html/ant.html#d0e1137

update (по умолчанию: false): Попробуйте создать скрипт обновления, представляющий «дельту» между тем, что находится в базе данных, и тем, что указывают сопоставления. Игнорирует создание / обновление атрибутов. (Не не использовать против производственных баз данных, нет никаких гарантий, что может быть сгенерирована правильная дельта или что базовая база данных может фактически выполнить необходимые операции)

1
ответ дан Matt Sidesinger 10 April 2009 в 15:29
поделиться

Вы также можете использовать DBMigrate . Это похоже на Liquibase:

Подобно 'rake migrate' для Ruby on Rails, эта библиотека позволяет вам управлять обновлениями базы данных для ваших Java-приложений.

0
ответ дан Hendy Irawan 10 April 2009 в 15:29
поделиться

Для одного приложения я использую SchemaUpdate, встроенную в Hibernate, прямо из класса начальной загрузки, поэтому схема проверяется при каждом запуске приложения. Это заботится о добавлении новых столбцов или таблиц, что в основном происходит со зрелым приложением. Для обработки особых случаев, таких как удаление столбцов, загрузчик просто вручную запускает ddl в try / catch, поэтому, если он уже был удален один раз, он просто молча выдает ошибку. Я не уверен, что сделал бы это с критически важными данными в производственном приложении, но за несколько лет и сотни развертываний у меня никогда не было проблем с этим.

2
ответ дан Brian Deterling 10 April 2009 в 15:29
поделиться

В качестве дальнейшего ответа на то, что Натан Воксланд сказал о LiquiBase , приведу пример выполнения миграции под Windows для базы данных mySql:

Поместите соединитель mysql в папке lib в дистрибутиве liquibase, например.

Создайте файл свойств liquibase.properties в корне дистрибутива liquibase и вставьте эти повторяющиеся строки:

driver: com.mysql.jdbc.Driver
classpath: lib\\mysql-connector-java-5.1.30.jar
url: jdbc:mysql://localhost:3306/OLDdatabase
username: root
password: pwd

Создайте или извлеките обновленную базу данных под другим именем, например NEWdatabase .

Теперь вы извлечете различия в файле Migration.xml со следующей командной строкой:

liquibase diffChangeLog --referenceUrl="jdbc:mysql://localhost:3306/NEWdatabase" 
--referenceUsername=root --referencePassword=pwd > C:\Users\ME\Desktop\Migration.xml

Наконец, выполните обновление, используя только что созданный Migration.xml. файл:

java -jar liquibase.jar --changeLogFile="C:\Users\ME\Desktop\Migration.xml" update

Примечание: все эти командные строки должны выполняться из домашнего каталога liquibase, в котором находятся liquibase.bat / .sh и liquibase.jar.

2
ответ дан Jad B. 10 April 2009 в 15:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: