@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 следуйте:

enter image description here

родственные конфигурации весны являются следующими:

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 возьмет на себя ответственность за остальные случаи.