gpt4 book ai didi

java - MariaDB 的 Hibernate 命名策略 (UPPER_SNAKE_CASE)

转载 作者:行者123 更新时间:2023-11-30 05:27:54 24 4
gpt4 key购买 nike

在我的应用程序中,我使用 Flyway 进行数据迁移,因此我定义了 UPPER_SNAKE_CASE 中所有名称的所有表(例如 users -> USERS、candidateGroups -> CANDIDATE_GROUP)。我为不同的环境提供了2种配置:本地和docker。在本地环境中我运行 h2,在 Docker 上我运行 MariaDB。

现在,在 h2 上运行时一切正常,在 MariaDB hibernate 上尝试对所有小写表执行操作,这会导致错误:

Caused by: java.sql.SQLException: Table 'application.users' doesn't exist

经过一些调查,我尝试添加到我的 application-docker.yml:

  spring:
jpa:
hibernate:
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl

这会导致 hibernate 中表名大写:由以下原因引起:java.sql.SQLException:表“application.Users”不存在

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

不幸的是,我没有找到任何与我的情况匹配的策略(我知道 this 展示了如何创建自定义命名策略,但我认为我的情况并不罕见),我应该为我的 MariaDB 配置使用什么命名策略适合我的情况吗?

最佳答案

Hibernate 中也没有 UPPER_SNAKE_CASE 命名策略或Spring Data JPA ,但人们可以通过扩展 PhysicalNamingStrategyStandardImpl 来定义他/她自己的或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);
}
}

最后应该在application.properties或application.yml中设置自定义的命名策略:

spring.jpa.hibernate.naming.physical-strategy=my.package.UpperSnakeCaseSpringPhysicalNamingStrategyImpl

有关 SO 的更多信息:

<小时/>

更新(2020年1月16日)

Naming Strategies in Hibernate 5

关于java - MariaDB 的 Hibernate 命名策略 (UPPER_SNAKE_CASE),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58188057/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com