MariaDB(UPPER_SNAKE_CASE)의 최대 절전 모드 명명 전략
애플리케이션에서 데이터 마이그레이션을 위해 플라이웨이를 사용하므로 모든 이름이 포함된 모든 테이블을 정의했습니다.UPPER_SNAKE_CASE
(예: 사용자 ->USERS
후보 그룹 ->CANDIDATE_GROUP
). 로컬과 도커의 두 가지 환경 구성을 제공했습니다.로컬 환경에서 h2를 실행하고 도커에서 마리아DB를 실행하고 있습니다.
이제 h2에서 실행하면 모든 것이 정상적으로 작동하지만 MariaDB hibernate에서는 모든 소문자 테이블에서 작업을 수행하려고 시도하면 다음 오류가 발생합니다.
원인: java.sql.SQL 예외:테이블 'application.users'이(가) 존재하지 않습니다.
몇 가지 조사 후에 나는 나의 것에 추가하려고 노력했습니다.application-docker.yml
:
spring:
jpa:
hibernate:
naming:
physical-strategy: org.hibernate.boot.model.naming.PhysicalNamingStrategyStandardImpl
이렇게 하면 최대 절전 모드에서 테이블 이름이 대문자로 표시됩니다.Caused by: java.sql.SQLException: Table 'application.Users' doesn't exist
주석이 있는 모든 테이블의 이름을 지정할 수 있습니다.@Table(name = "USERS")
모든 열의 이름도 제공하지만 이는 제가 원하는 솔루션이 아닙니다.
안타깝게도 사례와 일치하는 전략을 찾지 못했습니다(사용자 지정 명명 전략을 만드는 방법을 보여주는 것으로 알고 있지만 사례가 그렇게 흔하지는 않습니다). 사례와 일치하도록 MariaDB 구성에 어떤 명명 전략을 사용해야 합니까?
없습니다.UPPER_SNAKE_CASE
이름 지정 전략은 Hibernate 또는 Spring Data JPA에서 사용할 수 없지만 Physical Naming Strategy StandardImplor 또는 Spring Physical Naming Strategy를 확장하여 자신의 이름을 정의할 수 있습니다.
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);
}
}
최대 절전 모드를 구현하려면 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에 대한 자세한 정보:
업데이트(16.01.2020)
언급URL : https://stackoverflow.com/questions/58188057/hibernate-naming-strategy-for-mariadb-upper-snake-case
'IT' 카테고리의 다른 글
__dict__ 속성 설명 (0) | 2023.07.22 |
---|---|
plsql 루프 내에서 Oracle에 문자열 추가 (0) | 2023.07.22 |
CTE를 사용하기 위해 MariaDB 10.2.20으로 업데이트했습니다.여전히 "인식할 수 없는 문 유형"을 받는 중입니다.(근처 WITH) in phpMyAdmin (0) | 2023.07.22 |
표의 두 필드를 비교하고 상태 필드를 만드는 방법 (0) | 2023.07.22 |
"값이 너무 많아 압축을 풀 수 없습니다" 예외 (0) | 2023.07.22 |