当前位置: 首页 > 知识库问答 >
问题:

如何在micronaut中配置不同的hibernate命名策略?

贺元明
2023-03-14

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

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

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

即使我在应用程序中配置了物理命名策略。yml是这样的(以及各种变体,我尝试了各种物理命名策略的值):

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"

我仍然得到这个错误

原因:com.microsoft.sqlserver.jdbc.SQLServerExctive:无效的对象名称tp_63_dev.dbo.tge040_label

好像我的配置完全被忽略了。

Micronaut代码版本<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的更改显然被忽略了。

实际上是否有可能更改物理命名策略

更新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正在主动覆盖我的配置,这至少是非直观的。这种行为记录在什么地方了吗?

共有2个答案

晏志明
2023-03-14

我们在使用PostgreSQL时也遇到了同样的问题。我们通过使用

波乔:

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

应用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
邵昆琦
2023-03-14

我终于找到了。

默认物理命名策略的留档指出:

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

这显然意味着实际上无法从应用程序更改物理命名策略。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就不再试图对我的表名和字段名保持聪明了。

 类似资料:
  • 问题内容: 我正在使用postgresql数据库和spring + hibernate框架编写应用程序。 我将spring框架从4.1.5.RELEASE升级到4.2.0.RELEASE版本,并将hibernate框架从4.3.7.Final升级到了5.0.0.Final版本。 升级后,我在NamingStrategy中遇到问题。在postgresql数据库中,表列名称以小写字母用下划线分隔,在应

  • 问题内容: 我有简单的spring- jpa配置,在其中配置了Hibernate的。这意味着,如果我的实体类具有一个变量,那么Hibernate应该将其转换为用于查询数据库。但是,在我升级到Hibernate 5之后,这种命名转换就停止了。 错误:“字段列表”中的未知列“ user0_.userName” 这是我的Hibernate配置: 这是我的Entity类: 我不想在@Column批注中显式

  • 我知道我可以用注释命名所有表,并为所有列提供名称,但这不是我想要的解决方案。 不幸的是,我没有找到任何匹配我的案例的策略(我知道这展示了如何创建自定义命名策略,但我不认为我的案例是不常见的),我应该为我的MariaDB配置使用什么命名策略来匹配我的案例?

  • 我有一个spring boot项目,它使用以下设置运行: 我发现hibernate在映射atributes时没有将camelCase转换为SNAKE_CASE,而是将upper_case应用于它(因为Oracle不区分大小写,所以这并不重要): 这是我的实体: 编辑 我发现我的项目使用的是spring Boot1.4.5.发行版,但由于其他无可争议的原因,Hibernate的版本是4.2.19.f

  • 问题内容: 我对hibernate(5.1版)的命名策略有些困惑-即它更改了我的表名,我想避免这种情况。另外- 根据intelij似乎已弃用,但我找不到正确配置它的(另一种)方法。 我在application.properties中具有以下配置: 如前所述,第一个被标记为已练习。 现在我有一个实体: 表格名称是类似usaUploadTable 中的名称。 现在,当我运行我的应用程序时,我得到 表’

  • 我对hibernates(5.1版)的命名策略有点困惑——也就是说,它改变了我的表名,我希望避免这种情况。还有-