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

MariaDB的Hibernate命名策略(UPPER_SNAKE_CASE)

公良泰宁
2023-03-14
  spring:
    jpa:
     hibernate:
       naming:
         physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

我知道我可以用注释@table(name=“users”)命名所有表,并为所有列提供名称,但这不是我想要的解决方案。

不幸的是,我没有找到任何匹配我的案例的策略(我知道这展示了如何创建自定义命名策略,但我不认为我的案例是不常见的),我应该为我的MariaDB配置使用什么命名策略来匹配我的案例?

共有1个答案

祁和通
2023-03-14

在Hibernate或Spring Data JPA中都没有upper_snake_case命名策略,但是可以通过扩展PhysicalNamingStrategyStrategyMPL或SpringPhysicalNamingStrategy来定义他/她自己的命名策略。

在Spring Data JPA中更容易,因为Spring已经将名称转换为snake_case:

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;
import org.springframework.boot.orm.jpa.hibernate.SpringPhysicalNamingStrategy;

import java.io.Serializable;
import java.util.Locale;

public class UpperSnakeCaseSpringPhysicalNamingStrategyImpl extends SpringPhysicalNamingStrategy implements Serializable {

    @Override
    protected Identifier getIdentifier(String name, boolean quoted, JdbcEnvironment jdbcEnvironment) {
        name = name.toUpperCase(Locale.ROOT);
        return new Identifier(name, quoted);
    }
}

对于Hibernate,需要实现到snake_case的转换,并重写至少5个方法中的2个:

import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;

import java.io.Serializable;
import java.util.Locale;

public class UpperSnakeCasePhysicalNamingStrategyImpl extends PhysicalNamingStrategyStandardImpl implements Serializable {

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        return new Identifier(addUnderscores(name.getText()), name.isQuoted());
    }

    @Override
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
        return new Identifier(addUnderscores(name.getText()), name.isQuoted());
    }

    private static String addUnderscores(String name) {
        final StringBuilder buf = new StringBuilder(name.replace('.', '_'));
        for (int i = 1; i < buf.length() - 1; i++) {
            if (
                    Character.isLowerCase(buf.charAt(i - 1)) &&
                            Character.isUpperCase(buf.charAt(i)) &&
                            Character.isLowerCase(buf.charAt(i + 1))
            ) {
                buf.insert(i++, '_');
            }
        }
        return buf.toString().toUpperCase(Locale.ROOT);
    }
}
spring.jpa.hibernate.naming.physical-strategy=my.package.UpperSnakeCaseSpringPhysicalNamingStrategyImpl
  • 更改Hibernate 5命名策略+Spring Boot+注释
  • https://stackoverflow.com/questions/32437202

更新(16.01.2020)

Hibernate 5中的命名策略

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

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

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

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

  • 我尝试设置我的JPA映射。由于某些原因,我必须有相同的java变量/表列名(包括大写字母),但我不能设置Hibernate。我尝试了明确的列名: 对于隐式映射: 这两种方法都创建不带大写字母的列名——“nextinvoicenr”。 我还试图改变Hibernate配置添加: 但没有成功