Этот вопрос очень старый & 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 ++) ...
LiquiBase - ваш лучший выбор. Он имеет режим интеграции hibernate , который использует hbm2ddl Hibernate для сравнения вашей базы данных и вашего отображения hibernate, но вместо автоматического обновления базы данных он выводит файл журнала изменений в liquibase, который можно проверить перед фактическим запуском.
Хотя это и удобнее, любой инструмент, который выполняет сравнение вашей базы данных и ваших отображений гибернации, может ошибаться. См. http://www.liquibase.org/2007/06/the-problem-with-database-diffs.html для примеров. С помощью liquibase вы создаете список изменений базы данных по мере разработки в формате, который может выдержать код с ответвлениями и слияниями.
Вы можете использовать https://github.com/Devskiller/jpa2ddl инструмент, который предоставляет плагин Maven и Gradle и способен генерировать автоматические миграции схемы для Flyway на основе сущностей JPA , Сюда также входят все свойства, диалекты, пользовательские типы, стратегии именования и т. Д.
Я лично отслеживаю все изменения в сценарии миграции SQL.
Я использую задачу муравья hbm2ddl для генерации моего ddl. Существует опция, которая будет выполнять изменение таблиц / столбцов в вашей базе данных.
Пожалуйста, смотрите атрибут «update» задачи муравья hbm2ddl:
http://www.hibernate.org/hib_docs/tools/reference/en/html/ant.html#d0e1137
update (по умолчанию: false): Попробуйте создать скрипт обновления, представляющий «дельту» между тем, что находится в базе данных, и тем, что указывают сопоставления. Игнорирует создание / обновление атрибутов. (Не не использовать против производственных баз данных, нет никаких гарантий, что может быть сгенерирована правильная дельта или что базовая база данных может фактически выполнить необходимые операции)
Вы также можете использовать DBMigrate . Это похоже на Liquibase:
Подобно 'rake migrate' для Ruby on Rails, эта библиотека позволяет вам управлять обновлениями базы данных для ваших Java-приложений.
Для одного приложения я использую SchemaUpdate, встроенную в Hibernate, прямо из класса начальной загрузки, поэтому схема проверяется при каждом запуске приложения. Это заботится о добавлении новых столбцов или таблиц, что в основном происходит со зрелым приложением. Для обработки особых случаев, таких как удаление столбцов, загрузчик просто вручную запускает ddl в try / catch, поэтому, если он уже был удален один раз, он просто молча выдает ошибку. Я не уверен, что сделал бы это с критически важными данными в производственном приложении, но за несколько лет и сотни развертываний у меня никогда не было проблем с этим.
В качестве дальнейшего ответа на то, что Натан Воксланд сказал о 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.