Сущность Spring JPA и неподдерживаемый хэш-символ в имени столбца под h2

Позвольте мне показать вам проблему на следующих сценариях:

У меня есть объект с именем столбца VERSION# с суффиксом типа hash, и я хотел бы провести некоторое тестирование с этим объектом в базе данных h2. Столбец взят из официальной таблицы словаря Oracle USER_TYPE_VERSIONS, поэтому его нельзя изменить.

Однако h2 не поддерживает такие имена столбцов и, следовательно, не работает во время выполнения теста. Можно ли как-нибудь с этим справиться? Например, замена имени столбца в профиле h2 на VERSION или любой другой обходной путь?

Почему вы хотите включить хэш в имя столбца?

Dehan 17.10.2018 08:47

Потому что есть официальная таблица Oracle с таким именем столбца. Извините, добавлю выше для лучшего понимания.

Luke 17.10.2018 09:09

Вы пробовали выйти из #?

Sven Hakvoort 17.10.2018 09:35

К сожалению, это не работает. По-прежнему та же ошибка, что таблица не найдена по диалекту h2.

Luke 17.10.2018 09:42

Создать вид и сопоставить с ним свою сущность?

Alan Hay 17.10.2018 09:49

Я бы предпочел другой обходной путь, не влияющий на сторону базы данных Oracle. Чтобы таблица оставалась как есть. Возможно, создать объект под профилем h2, где проблемный столбец должен быть без символа решетки. Тогда h2 сможет его правильно загрузить. Не уверен.

Luke 17.10.2018 09:56

Вы можете переопределить что угодно с помощью файла orm.xml. Вам просто понадобится механизм, который будет активен только для H2. docs.jboss.org/hibernate/stable/annotations/reference/en/htm‌ l /…. См. Также stackoverflow.com/q/8750777/1356423

Alan Hay 17.10.2018 09:59

Это интересно. Я посмотрю и дам тебе знать в следующий раз.

Luke 17.10.2018 10:17
1
8
686
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Решение состоит в том, что столбец VERSION# необходимо экранировать кавычками в классе модели примерно так:

@Entity
@Table("USER_TYPE_VERSIONS")
public class UserTypeVersion {

   @Column("\"VERSION#\"")
   private String version;
   ...
}

Наконец, спящий режим теперь может загружать такой объект в базу данных h2. Он узнаваем сам по себе. Таким образом следует заменить любые специальные символы.

Примечание: не забудьте упомянуть о таком изменении также в data.sql, если у вас есть тестовые данные.

insert into USER_TYPE_VERSIONS("VERSION#") values ("IT WORKS NOW!");

Другие вопросы по теме