【问题标题】:How to configure a different hibernate naming strategy in micronaut?如何在 micronaut 中配置不同的休眠命名策略?
【发布时间】:2020-03-15 15:59:02
【问题描述】:

我是 Micronaut 的新手,我正在尝试将它与现有数据库一起使用。

我有一个具有显式表和列命名的实体,例如

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

即使我像这样在 application.yml 中配置 physical_naming_strategy(以及变体,我已经尝试了 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"

之后:

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

调试我得到这个:

在我看来,这意味着 micronaut 正在积极地覆盖我的配置,这至少是不直观的。这种行为是否记录在某处?

【问题讨论】:

    标签: hibernate micronaut


    【解决方案1】:

    我终于找到了。

    DefaultPhysicalNamingStrategy 的文档指出:

    要使用的默认 PhysicalNamingStrategy。可以换成 另一个声明: @Replaces(DefaultPhysicalNamingStrategy.class) 并实现 物理命名策略

    这显然意味着实际上没有办法从 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 不再试图对我的表和字段名称进行智能处理。

    【讨论】:

      【解决方案2】:

      我们在使用 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
      

      【讨论】:

      • 要么我不理解修复,要么它不适合我。用新的证据更新了问题。
      • 您是否尝试过对 POJO 中的表名进行转义?像这样:"\"TBLNAME\""
      猜你喜欢
      • 2020-01-30
      • 1970-01-01
      • 2014-05-03
      • 2012-09-24
      • 2012-09-28
      • 2018-02-18
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多