@Column (unique = true) создает предупреждение o.h.двигатель.интерфейс jdbc.спи.SqlExceptionHelper: SQL код предупреждения: 0, SQLState: 00000
в проекте Пружинная Загрузка 2.0.0.Отпустите, когда я запускаю приложение в первый раз, когда создаются таблицы базы данных, я получаю следующее предупреждающее сообщение:
Hibernate: alter table if exists bpermission drop constraint if exists UK_qhp5om4s0bcb6j0j8pgcwitke
2018-03-14 11:32:03.833 WARN 15999 --- [ restartedMain] o.h.engine.jdbc.spi.SqlExceptionHelper : SQL Warning Code: 0, SQLState: 00000
2018-03-14 11:32:03.833 WARN 15999 --- [ restartedMain] o.h.engine.jdbc.spi.SqlExceptionHelper : constraint "uk_qhp5om4s0bcb6j0j8pgcwitke" of relation "bpermission" does not exist, skipping
обратите внимание на имя - > ограничения uk_qhp5om4s0bcb6j0j8pgcwitke
...и ниже я вижу, что это регистрируется:
Hibernate: alter table if exists bpermission add constraint UK_qhp5om4s0bcb6j0j8pgcwitke unique (label)
Hibernate: alter table if exists bpermission drop constraint if exists UK_ow4uw3orjjykeq869spvqtv6u
из предыдущего сообщения мы видим, что Hibernate добавляет ограничение UK_qhp5om4s0bcb6j0j8pgcwitke
, то же самое, что показано в предупреждении, но первая буква в верхнем регистре. Это связано с unique
ограничение в label
свойство (см. класс ниже).
(возможные) вовлеченные сущности в получение этого предупреждения:
BPermission
@Data
@NoArgsConstructor(force = true)
@RequiredArgsConstructor
@EqualsAndHashCode(callSuper = true, exclude = "roles")
@ToString(callSuper = true, exclude = "roles")
@Entity
public class BPermission extends GmsEntity {
@NotNull()
@NotBlank()
@Size(max = 255)
@Pattern(regexp = "someDefinedRegexp")
@Column(unique = true, nullable = false, length = 255)
private final String name;
@NotNull()
@NotBlank()
@Size(max = 255)
@Column(unique = true, nullable = false, length = 255)
private final String label;
@ManyToMany(mappedBy = "permissions")
private Set<BRole> roles;
}
BPermission
связано (в случае, если эта информация каким-либо образом помогает) с
BRole
@Data
@NoArgsConstructor(force = true)
@RequiredArgsConstructor
@EqualsAndHashCode(callSuper = true, exclude = "permissions")
@ToString(callSuper = true, exclude = {"description", "permissions"})
@Entity
public class BRole extends GmsEntity{
@NotNull()
@NotBlank()
@Size(max = 255)
@Pattern(regexp = "someDefinedRegexp"))
@Column(unique = true, nullable = false, length = 255)
private final String label;
@Size(max = 10485760)
@Column(length = 10485760)
private String description;
private Boolean enabled = false;
@ManyToMany
@JoinTable(
name = "brole_bpermission",
joinColumns = @JoinColumn(name = "brole_id"),
inverseJoinColumns = @JoinColumn(name = "bpermission_id")
)
private Set<BPermission> permissions;
public void addPermission(BPermission... p) {
// code for adding permissions
}
public void removePermission(BPermission... p) {
// code for removing permissions
}
public void removeAllPermissions() {
// code for removing permissions
}
они сопоставляются с PostgreSQL9.5.11 база данных as следуйте:
родственные конфигурации весны являются следующими:
spring.datasource.url = jdbc:postgresql://127.0.0.1/mydbname
spring.datasource.username = postgres
spring.datasource.password = postgres
spring.datasource.driver-class-name = org.postgresql.Driver
spring.jpa.hibernate.ddl-auto = update
spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation = true
spring.jpa.open-in-view = false
Я уже упоминал предупреждение для всех объектов со свойствами, которые аннотируются @Column(unique = true)
Q:
- почему это предупреждение брошено? Возможно... жучок?
- как я могу избавиться от него?
конечно, иногда не плохо вообще, но я чувствую, что здесь это либо ненужно, либо указывает на то, что "что-то должно быть сделано по-другому", несмотря на код sqlcode 0000 означает "successful_completion".
PS: я использую Ломбок.
2 ответов
Spring Boot 2.0 (Спящий Режим 5?) видимо использует DROP_RECREATE_QUIETLY
as уникальная стратегия обновления ограничений что действительно неправильно в качестве опции по умолчанию, потому что просто то, что он делает каждый раз, когда вы запускаете приложение, удаляет уникальный индекс и создает его снова. Если вы работаете с базами данных с некоторыми (много?) данные я могу себе представить, насколько медленным будет начало всего с этой опцией.
в таком случае при запуске на пустой базе данных, операция удаления индекса генерирует предупреждение,которое можно увидеть в журналах. Когда вы начинаете снова, предупреждение исчезает, но оно молча выполняет дорогостоящую операцию воссоздания индекса.
отключить этого нужно переключать стратегию на RECREATE_QUIETLY
со следующими параметрами:
# for plain hibernate
hibernate.schema_update.unique_constraint_strategy=RECREATE_QUIETLY
# for spring data
spring.jpa.properties.hibernate.schema_update.unique_constraint_strategy=RECREATE_QUIETLY
это похоже на ошибку.
Я бы рекомендовал вам создать схему с помощью инструментов миграции более высокого уровня, таких как flywaydb
и пусть hibernate проверяет только сгенерированную схему. Он интегрирован в spring-boot, и его очень легко настроить, см. в документацию и примеры.
преимущество в том, что у вас есть полный контроль над схемой, у вас нет неожиданных изменений схемы при обновлении hibernate.
как правило, автоматический генерация схемы используется только во время разработки, но не в производстве. Вы можете найти более подробную информацию о том, почему это так важно здесь.
имея такую настройку, вы можете позволить hibernate генерировать схему только в режиме разработки, но flighway возьмет на себя ответственность за остальные случаи.