пятница, 6 февраля 2009 г.

MS SQL 2005. Работа из консоли (sqlcmd)

В MS SQL 2005 появилась(заменила другие) консольная утилитка sqlcmd. Она предназначена для работы с MS SQL 2005 при помощи консоли.
Формат вызова у неё такой:
Использование: Sqlcmd    [-U идентификатор_входа]  [-P пароль]
[-S сервер] [-H имя_узла] [-E доверенное_соединение]
[-d имя_используемой_БД] [-l время_ожидания_входа] [-t время_ожидания_запроса]
[-h заголовки] [-s разделитель_столбцов] [-w ширина_экрана]
[-a размер_пакета] [-e отображать_ввод] [-I идентиф.в_кавычках]
[-c конец_команды] [-L[c] вывести список серверов[очистить_вывод]]
[-q "запрос_ком.строки"] [-Q "запрос_ком. строки" и выйти]
[-m код_ошибки] [-V уровень_серьезности] [-W удал.конечные пробелы]
[-u вывод_в_юникоде] [-r[0|1] вывод на STDERR]
[-i входной_файл] [-o выходной_файл] [-z новый_пароль]
[-f <кодовая_страница> | i:<кодовая_страница>[,o:<кодовая_страница>]]
[-Z создать пароль и выйти]
[-k[1|2] удалить[заменить] управляющие символы]
[-y ширина_экрана_переменного_типа]
[-Y ширина_экрана_фиксированного_типа]
[-p[1] печатать статистику [формат столбцов]]
[-R использовать региональные настройки клиента]
[-b завершить выполнение командного файла при ошибке]
[-v переменная = "значение"...] [-A выделенное административное соединение]
[-X[1] отключить команды, сценарии запуска, переменные среды [и выйти]]
[-x отключить подстановку переменных]
[-? показать сводку по синтаксису]

Это значит, что можно создать файл скрипта, например для восстановление БД и
не лезть в тормознутую SQL Management Studio.
Файл restore.sql:

RESTORE DATABASE my_database FROM DISK = 'D:/DB/Backups/my_db.bak'
WITH REPLACE
[можно ещё добавить действий по смене владельца таблиц, обработке, добавлению данных т.д.]

Тогда этот скрипт можно выполнить следующей командой:

>sqlcmd -d my_database -i "C:/scripts/restore.sql" -o result_restore.txt

Результат восстановления БД будет выведен в файл result_restore.txt.
Также можно непосредственно выполнять команды при помощи этой утилиты:
>sqlcmd -d my_database
1>:out result.txt //выведет результаты в файл
1>exit(select * from TBL_SAMPLE) //выполнит запрос и выйдет

Можно заюзать так:
>sqlcmd -d my_database -q "select * from TBL_SAMPLE"
Выведет результаты выполнения скрипта на экран.

Вообщем консоль способствует повышению эффективности труда :)

четверг, 5 февраля 2009 г.

Hibernate. Атрибут inverse

При работе с Hibernate часто ли вы задумываетесь зачем и для чего нужен атрибут inverse и что означает inverse = "true"? В данной заметке будут раскрыта эта тема.


По существу, "inverse" обозначает какой конец отношения должен игнорироваться. Когда вы сохраняете предка, имеющего коллекцию потомков, должны ли вы спрашивать предка о его потомках, или же спрашивать потомков, кто является их предком?

Итак взгляните на код:
Parent parentA = new Parent();
Parent parentB = new Parent();
Child child = new Child();
parentA.getChildren().add(child); // с помощью самого предка
child.setParent(parentB); // с помощью установления предка у потока

как hibernate сохранит эту ситуацию? Для однонаправленной связи one-to-many это очевидно; только один конец отношения создаётся (это только parent.addChild(), не child.setParent()), но когда связь является двунаправленной (parent.getChild и child.getChildren), то вы должны указать, является ли one-to-many обратным(inverse) или нет.

Что значит быть обратным? Это информирует hibernate, что нужно игнорировать конец отношения. Если отношение one-to-many отмечено, как обратное, hibernate будет создавать child-> parentB отношение (child.getParent). Если one–to–many отношение не было помечено, как обратное, тогда child->parentA отношение будет создано.


Просто запомните следующую вещь:
  • если inverse = "true" на one–to–many, тогда child.getParent будет вызван.
  • если inverse = "false" на one–to–many, тогда parent.getChildren будет вызван.