Spring Boot с Hibernate: автоматическая генерация схемы базы данных со столбцами, которая может содержать доли секунд - PullRequest
1 голос
/ 11 июля 2019

У меня есть подпружиненный проект, в котором мне нужно сохранить время последнего изменения сущностей с точностью до микросекунд - фактически, свойство аудита, где хранится версия сущности. В моей среде разработки я использую базу данных MySQL, а временные типы MySQL поддерживают дроби до 6 цифр. Поэтому я могу определить соответствующий столбец с помощью timestamp(6) или datetime(6) при создании схемы вручную.

Но я хочу, чтобы схема генерировалась автоматически с помощью свойства spring.jpa.hibernate.ddl-auto=update. Я знаю, что это не очень хорошая практика в производственной среде, но этот проект будет шаблоном или семенем для многих других проектов. Поэтому мне нужно сохранить его в общем виде, чтобы он не зависел от системы баз данных с подчеркиванием.

Для MySQL я могу заставить его работать, используя columnDefinition аргумент @Column аннотации, как показано ниже.

@Version
@Column(columnDefinition= "datetime(6)")
Timestamp version;

Но это не будет работать в других базах данных, где datetime(6) не является допустимым временным типом.

Я попытался автоматически сгенерировать аргумент конкретной настройки схемы базы данных scale (@Column(scale= 6)), но он просто игнорирует дробную часть, генерирует столбец типа datetime, а не datetime(6).

Мне любопытно, есть ли способ сделать это, хотя я не знаю.

Ребята, можете ли вы дать мне какую-то информацию по этому вопросу?

Обновление

@ crizzis в своем комментарии научил меня, что речь идет об использовании правильного hibernate.dialect . Итак, с org.hibernate.dialect.MySQL57Dialect я смог автоматически сгенерировать datetime (6) столбцов. Затем я попытался проконтролировать количество цифр в дробной части с аргументом scale, но безуспешно, оно всегда имеет 6 цифр.

Теперь я хотел бы знать, возможно ли это без использования аргумента columnDefinition внутри @Column аннотации.

1 Ответ

1 голос
/ 12 июля 2019

MySql57Dialect (и / или MySql57InnoDbDialect, в зависимости от версии Hibernate), тип SQL TIMESTAMP уже сопоставлен с типом столбца базы данных TIMESTAMP(6):

registerColumnType( Types.TIMESTAMP, "datetime(6)" );

Это означает, что определение столбца по умолчанию должно поддерживать точность в микросекундах. Лучший способ действий - позволить Hibernate генерировать схему без переопределения определения столбца. Для большинства других баз данных он будет постепенно уменьшаться до простого TIMESTAMP.

Если вы хотите в будущем переключиться на другую базу данных, которая также поддерживает микросекундную точность, найдите соответствующий Dialect; Скорее всего, он будет включать поддержку этой функции, а если нет, вы всегда можете настроить ее.

Затем я попытался проконтролировать количество цифр в дробной части с аргументом масштаба, но безуспешно, оно всегда имеет 6 цифр.

Это потому, что в приведенном выше вызове registerColumnType точность TIMESTAMP установлена ​​на 6. Если вы хотите иметь возможность настроить его, разверните свой собственный диалект (начиная с MySql57Dialect) и переопределить определение с помощью:

registerColumnType(Types.TIMESTAMP, 6, "timestamp($l)"); //l for length, p for precicion, s for scale

После этого вы сможете переопределить длину столбца, используя length, precision или scale (в зависимости от того, что вы положили в скобки). Обратите внимание, что второй аргумент метода определяет максимально возможную длину столбца для этого конкретного типа данных, поэтому, если вы хотите, например, например, Точность наносекунды, вы должны изменить его на 9.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...