2016-10-21 10 views
0

Мое приложение только считывает данные из базы данных. Нет операций создания/обновления/удаления. Я пытаюсь сопоставить одно представление БД с сущностью JPA. В этом представлении нет уникальных идентификаторов. Таким образом, каждая строка уникальна. Но есть вероятность, что значение некоторых столбцов может быть нулевым.JPA DBUnit HsqlDb: отключить проверки ограничений?

Теперь проблема заключается в том, что:

1) Я не могу делать какие-либо изменения в database.Its из моей области. Таким образом, представление не может быть добавлено с новым столбцом для уникального идентификатора.

2) Я не могу создать объект JPA без первичного ключа, так как он будет жаловаться на то, что он по крайней мере требует уникального уникального ключа.

3) Если я применяю аннотацию @Id ко всем столбцам, то она логически имеет смысл, поскольку каждая строка уникальна в моем случае. Но во время моего модульного тестирования HSQLDB будет жаловаться, что некоторые уникальные столбцы могут не иметь нулевого значения.

4) Поэтому я решил отложить/отключить все ограничения. Поскольку в моем случае ограничения рассматриваются только во время создания схемы в памяти с использованием DBUnit и HsqlDb.

Я попытался выполнить следующее подготовленное заявление:

SET CONSTRAINTS ALL DEFERRED 

Но он терпит неудачу с ошибкой:

Caused by: java.sql.SQLSyntaxErrorException: user lacks privilege or object not found: CONSTRAINTS 

Я не уверен, как отключить проверку ограничений во время начальной инициализации БД. Я уже отключил проверки внешнего ключа в прошлом, используя:

SET DATABASE REFERENTIAL INTEGRITY FALSE 

И он работает без каких-либо проблем. Пожалуйста, дайте мне знать, если у вас есть идея о том, как отключить все проверки ограничений для HsqlDb.

Jar Версии:

DbUnit - 2.5.0

Junit - 4.10

HSQLDB 2.3.0

JDK - 1,7

Обновление 1:

Я обновил m y Версия hsqlDb jar до 2.3.4. Я нашел folowing ссылка:

http://hsqldb.org/doc/guide/dbproperties-chapt.html#N155DE

Затем я попытался выполнить эти заявления на подключение первоначально:

SET DATABASE SQL UNIQUE NULLS { TRUE | FALSE } 

Но это не помогло.

Update 2:

Я попытался установить эти столбцы явно обнулить с помощью:

ALTER TABLE T_NAME ALTER COLUMN C_NAME SET NULL 

Но я получаю ошибку о том, что:

column is in primary key in statement [ALTER TABLE T_NAME ALTER COLUMN C_NAME SET NULL] 
+0

Как это проблема, если вы только читаете из базы данных? Если вы никогда не пишете, то почему «HSQLDB жалуется, что некоторые уникальные столбцы могут не иметь нулевого значения *»? –

+0

@a_horse_with_no_name: Проблема в том, что я пишу юниты с использованием фреймворка DbUnit и HsqlDb в качестве моей базы данных в памяти. Прежде чем мой тест будет выполнен, он возьмет мой объект JPA и попытается создать в базе данных памяти, используя это. После создания базы данных она пытается вставить данные в каждую таблицу (здесь представление рассматривается как таблица). И тогда HsqlDb жалуется на нарушение ограничений.FYI, данные, которые являются insrted, извлекаются ранее из реальной реальной базы данных и сохраняются как файлы xml. – user613114

ответ

0

Я решил эту проблему путем удаления первичного ключа первой помощи:

ALTER TABLE T_NAME DROP PRIMARY KEY 

А затем удаление не нулевое ограничение для отдельных столбцов с помощью:

ALTER TABLE T_NAME ALTER COLUMN C_NAME SET NULL 

Как Джефф предложил в своем ответе, имеет смысл написать отдельный класс для отключения ограничений для отдельных наборов тестов.

1

Две мысли, которые могут помочь :

  1. При назначении лица JPA с составным первичным ключом к существующей базе данных, @EmbeddedId правильный подход к сущности против нескольких @Id полей:

    1. Создать второй класс с несколькими полями @Id и аннотирования этот класс с @Embeddable.
    2. Создайте одно поле типа второго класса на объекте, аннотированное с помощью @EmbeddedId.

    Кроме того, так как он используется в-режиме только для чтения, с помощью вставного и обновляемым @Column атрибуты на полях @Id: @Column (вставляемый = ложь, обновляемым = ложный)

    Это может заставить провайдера JPA вести себя по-разному в связи с проблемой уникальности.

  2. Для аналогичной ситуации я удалил ограничения ссылочной целостности с помощью Apache Derby. Я предполагаю, что это будет работать и для HSQLDB.

    В вашем вопросе не указано, в какой момент вы выдаете команды ограничений на удаление, поэтому убедитесь, что вы произвели их в начале каждого теста, требующего устранения ограничений.

    Я написал класс «ConstraintManipulator», который удалил и восстановил ограничения (-и). Те тесты, которые нуждались в ограничениях, вызывали правильные методы удаления ConstraintManipulator перед тестированием и добавляли методы после теста (только для определенных тестов были исключены определенные ограничения и восстановлены для последующих тестов). Эти методы просто выдали команды DDL («add constraint ...», «drop constraint ...»), используя соединение базы данных JDBC с настройкой dbUnit.

+0

Привет, Джефф .. Не могли бы вы дать ссылку на свой класс ConstraintManipulator? Я уже понял решение моего scneario. Я прежде всего удаляю первичный ключ, используя (ALTER TABLE T_NAME DROP PRIMARY KEY), и после этого я удаляю ненулевое ограничение, используя (ALTER TABLE T_NAME ALTER COLUMN C_NAME SET NULL). Я хотел бы проверить ваш подход к удалению ограничений во время выполнения для определенных классов. – user613114

+0

Нет, извините, это не общедоступный код. Это просто, как вы описали ваш, просто создавая строку DDL из «ограничения на падение» и выполняя ее. – Jeff

+0

Perfect Jeff .. Большое спасибо за ваше время !!!! – user613114