Как настроить другую стратегию именования гибернации в micronaut?

Я новичок в Micronaut и пытаюсь использовать его с существующей базой данных.

У меня есть объект с явным именованием таблиц и столбцов, например

@Entity
@Table(name = "TGE040LABEL", schema = "dbo", catalog = "tp_63_dev")
@IdClass(Tge040LabelEntityPK.class)
public class Tge040LabelEntity

и даже если я настрою physical_naming_strategy в application.yml следующим образом (и варианты, я пробовал разные значения для _3 _...):

jpa:
    default:
        entity-scan:
            packages:
                - 'my.app.domain'
        properties:
            hibernate:
                hbm2ddl:
                    auto: none
                show_sql: true
                physical_naming_strategy: "io.micronaut.data.model.naming.NamingStrategies.UpperCase"
                dialect: "org.hibernate.dialect.SQLServerDialect"

Я все еще получаю эту ошибку

Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: Invalid object name 'tp_63_dev.dbo.tge040_label'.

как будто моя конфигурация полностью игнорируется.

Версия Микронавта - micronautVersion=1.3.3

Я что-то упускаю?

ОБНОВИТЬ

До:

jpa:
    default:
        entity-scan:
            packages:
                - 'my.app.domain'
        properties:
            hibernate:
                hbm2ddl:
                    auto: none
                show_sql: true
                dialect: "org.hibernate.dialect.SQLServerDialect"

введите здесь описание изображения

После:

jpa:
    default:
        entity-scan:
            packages:
                - 'my.app.domain'
        properties:
            hibernate:
                hbm2ddl:
                    auto: none
                show_sql: false
                dialect: "org.hibernate.dialect.SQLServerDialect"
                physical_naming_strategy: 'org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl'

введите здесь описание изображения

Просто чтобы сказать, конфигурация находится в нужном месте, изменения в show_sql соблюдаются, изменения в physical_naming_strategy явно игнорируются.

Действительно ли возможно изменить physical_naming_strategy?

ОБНОВЛЕНИЕ 2

Изменил мою конфигурацию вот так:

jpa:
    default:
        entity-scan:
            packages:
                - 'my.app.domain'
        properties:
            hibernate:
                id:
                    new_generator_mappings: false
                format_sql: true
                globally_quoted_identifiers_skip_column_definitions: true
                jdbc:
                    lob:
                        non_contextual_creation: true
                dialect: org.hibernate.dialect.SQLServerDialect
                ddl-auto: none
                physical_naming_strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
                implicit_naming_strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl

и отладки я получаю следующее:

введите здесь описание изображения

Это означает, на мой взгляд, что микронавт активно переопределяет мою конфигурацию, которая, по крайней мере, не является интуитивно понятной. Это поведение где-то задокументировано?


person Raffaele Castagno    schedule 15.03.2020    source источник


Ответы (2)


Я наконец нашел это.

Документация для DefaultPhysicalNamingStrategy гласит:

Используемая по умолчанию PhysicalNamingStrategy. Может быть заменен другим компонентом, который объявляет: @Replaces (DefaultPhysicalNamingStrategy.class) и реализует PhysicalNamingStrategy.

Очевидно, это означает, что на самом деле нет способа изменить физическую стратегию именования из application.yml.

Фактически, реализация bean-компонента настраиваемой стратегии именования выглядит следующим образом:

@Replaces(DefaultPhysicalNamingStrategy.class)
public class PhysicalNamingStrategyCustom implements PhysicalNamingStrategy
{

    @Override
    public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment jdbcEnvironment)
    {
        return name;
    }

    @Override
    public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment jdbcEnvironment)
    {
        return name;
    }

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment jdbcEnvironment)
    {
        return name;
    }

    @Override
    public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment jdbcEnvironment)
    {
        return name;
    }

    @Override
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment jdbcEnvironment)
    {
        return name;
    }
}

сделали свое дело, и JPA / hibernate больше не пытается разбираться в именах моих таблиц и полей.

person Raffaele Castagno    schedule 20.03.2020

У нас такая же проблема с PostgreSQL. Мы исправили это, используя

Поджо:

@Table(name="\"TBLTABLE\"", schema="a_schema"

application.yml:

jpa:
database: POSTGRESQL
show-sql: true
open-in-view: false
generate-ddl: false
properties:
  hibernate:
    id:
      new_generator_mappings: false
    format_sql: true
    globally_quoted_identifiers_skip_column_definitions: true
    jdbc:
      lob:
        non_contextual_creation: true
    dialect: org.hibernate.dialect.PostgreSQL9Dialect
hibernate:
  ddl-auto: none
  naming:
    physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
    implicit-strategy: org.hibernate.boot.model.naming.ImplicitNamingStrategyLegacyJpaImpl
database-platform: org.hibernate.dialect.PostgreSQLDialect
person 3logy    schedule 17.03.2020
comment
Либо я не понял фикс, либо он у меня не работает. Обновил вопрос новыми доказательствами. - person Raffaele Castagno; 20.03.2020
comment
Вы пытались избежать имени таблицы в POJO? вот так: \ TBLNAME \ - person 3logy; 21.03.2020