Как настроить другую стратегию именования hibernate в micronaut? - PullRequest
0 голосов
/ 15 марта 2020

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

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

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

и даже если я настрою physical_naming_strategy в application.yml, как это (и варианты, я пробовал различные значения для physical_naming_strategy ...):

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'.

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

Версия Micronaut 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"

enter image description here

После:

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'

enter image description here

Проще говоря, конфиг находится в нужном месте, изменения в 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

и отладки я получаю это:

enter image description here

значение, на мой взгляд, т Шляпа micronaut активно переопределяет мою конфигурацию, которая по крайней мере не интуитивна. Задокументировано ли это поведение где-нибудь?

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Я наконец нашел его.

В документации для DefaultPhysicalNamingStrategy указано:

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

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

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

@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 больше не пытается быть умным в отношении имен моих таблиц и полей.

0 голосов
/ 18 марта 2020

У нас та же проблема с использованием PostgreSQL. Мы исправили это с помощью

Pojo:

@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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...