Как заставить HSQLDB выдавать сообщения об ошибках во время инициализации источника данных из файла .script? - PullRequest
1 голос
/ 13 августа 2010

Я работаю над приложением Java, которое будет использовать некоторые классы Hibernate (аннотированные JPA), поддерживаемые источником данных HSQLDB (DBCP BasicDataSource). Я пытаюсь вручную настроить файл HSQLDB ".script" (который я не могу на всю жизнь найти авторитетное имя для веб-поиска / чтения документов; это только упомянуто мимоходом), чтобы быстро добавить некоторые новые таблицы памяти для тестирования. Проблема в том, что любые ошибки, которые возникают, когда HSQLDB запускает этот скрипт, кажется, нигде не регистрируются и не регистрируются. Например, если у меня есть оператор INSERT в этом .script (очень распространенный сценарий использования для установки начального набора данных), и есть проблема с ним (например, неправильный формат даты, неправильное количество столбцов и т. Д.), Ничего когда-либо сообщается, и нет никаких исключений. Я только позже замечу, когда HQL-запрос, который я создаю в тестовом примере, выдает исключение из-за результата NULL, которого программа не ожидает, так как набор данных должен быть правильно инициализирован в этой точке.

Единственная причина, по которой я даже выяснил, что есть проблема с оператором INSERT, заключалась в том, что они выполнялись в необработанном SQLConnection на источнике данных HSQLDB, а не в файле .script, и наблюдали за исключениями SQLExceptions, которые были выброшены при этом. точка.

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

Есть идеи, что попробовать? Может, какая-то конфигурация мне не хватает? Я пытался искать во всех документах HSQLDB безрезультатно, но это не обязательно означает, что ответа нет. В случае, если это имеет значение, сценарий использования, который я пытаюсь заставить работать, - это контекст приложения Spring, инициализированный в тестовом примере JUnit (через объект FileSystemXmlApplicationContext). Спасибо за любую помощь.

Ответы [ 2 ]

0 голосов
/ 13 августа 2010

Я не думаю, что это поддерживается просто потому, что файл сценария, содержащий определение таблиц и других объектов базы данных, а также данные для некэшируемых таблиц не должен содержать синтаксически некорректные операторы (онидолжны быть написаны самим HSQLDB).

Но поскольку вы используете Hibernate, я бы предложил использовать функцию import.sql, анонсированную в Rotterdam JBug и import.sql в Hibernate.сообщение в блоге:

import.sql: легко импортировать данные в свои юнит-тесты

Hibernate имеет изящную небольшую функцию, которая недостаточно документирована и неизвестна.Вы можете выполнить сценарий SQL во время создания SessionFactory сразу после создания схемы базы данных, чтобы импортировать данные в новую базу данных.Вам просто нужно добавить файл с именем import.sql в корень пути к классу и установить create или create-drop в качестве свойства hibernate.hbm2ddl.auto.

Я использую его для Поиск в спящем режиме в действии Теперь, когда я начал главу запроса.Он инициализирует мою базу данных свежим набором данных для моих модульных тестов.JBoss Seam также часто использует его в различных примерах.import.sql - это очень простая функция, но довольно полезная.Помните, что SQL может зависеть от вашей базы данных (ах переносимость!).

#import.sql file
delete from PRODUCTS
insert into PRODUCTS (PROD_ID, ASIN, TITLE, PRICE, IMAGE_URL, DESCRIPTION) values ('1', '630522577X', 'My Fair Lady', 19.98, '630522577X.jpg', 'My Fair blah blah...');
insert into PRODUCTS (PROD_ID, ASIN, TITLE, PRICE, IMAGE_URL, DESCRIPTION) values ('2', 'B00003CXCD', 'Roman Holiday ', 12.98, 'B00003CXCD.jpg', 'We could argue that blah blah');

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

Другой вариант - использовать DbUnit ,Но если (не) переносимость не является проблемой, я бы использовал трюк import.sql.

Смежные вопросы

0 голосов
/ 13 августа 2010

Файл .script (это официальное имя) создается HSQLDB при завершении работы базы данных и читается при ее открытии.Он не предназначен для изменения пользователем, за исключением некоторых сценариев обновления старых версий.Поэтому предполагается, что целостность данных сохраняется и для максимизации скорости загрузки не выполняется проверка обнуляемости или ссылочной целостности и неправильного количества столбцов.Нарушения первичного ключа или уникального ограничения обнаруживаются, поскольку данные вставляются в индексы.

Я прочитал упоминание о DBUnit (расширение JUnit для операций с базами данных), поддерживающее то, что вам нужно сделать.

...