IT

테이블에 스프링 부트 JPA 삽입(대문자 이름, 휴지 상태)

itgroup 2023. 1. 1. 11:10
반응형

테이블에 스프링 부트 JPA 삽입(대문자 이름, 휴지 상태)

다음과 같이 매핑된 테이블엔티티가 있습니다

@Entity
public class ItemsToRegister implements Serializable{

@Id
@Column(name = "ID_ITEM_TO_REGISTER")
@GeneratedValue(strategy = GenerationType.AUTO)
private int id;
.....

데이터베이스에 새로운 레코드를 삽입하려고 했을 때 테이블명은 소문자로 변환되었습니다: items_to_register 입니다.테이블명은 ITEMS_TO_REGISTER MySql 설정을 변경하지 않고 문제를 수정하려면 어떻게 해야 합니까?(my.cnf)

application.properties 파일에 다음과 같은 파일이 있습니다.

spring.jpa.hibernate.dialect = org.hibernate.dialect.MySQL5Dialect
spring.jpa.hibernate.naming_strategy = org.hibernate.cfg.ImprovedNamingStrategy

휴지 상태 5의 경우,

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

application.properties 파일에 저장됩니다.

@jasonleakey가 제안했듯이 다음과 같이 명명 전략을 사용하는 것을 고려해 볼 수 있습니다.

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

그러면 Hibernate에 @Table(name=" ") 또는 @Column(name=" " " " " ")에 지정된 대로 SQL을 생성하도록 지시합니다.잘 알겠습니다.

단, 엔티티 클래스에서 @Table, @Column 주석 없이 Physical Naming Strategy를 사용하는 경우 hibernate는 클래스 이름과 변수 이름을 사용하여 SQL을 생성합니다.다음 Java 클래스를 고려하십시오.

Class Employee {
   private String firstName;
   private String lastName; 
}

생성된 SQL은 다음과 같습니다.

select employee0_.firstName,employee0_lastName from Employee employee0_;

일반적으로 DB의 열은 FIRST_NAME 및 LAST_NAME으로, 테이블 이름은 EMPORY로 정의하기 때문에 이는 좋은 선택이 아닙니다.Physical Naming Strategy를 사용하지 않았다면 SQL은 다음과 같습니다.

select employee0_.first_name,employee0_last_name from employee employee0_;

다음 두 가지 옵션 중 하나를 선택할 수 있습니다.

  • Physical Strategy를 사용하여 @Table 및 @Column 주석을 사용하여 Java 코드에서 모든 테이블 이름/컬럼 이름을 명시적으로 정의합니다.
    또는
  • db에 소문자 테이블 이름을 정의하고 휴지 상태에서 자동으로 테이블 이름/컬럼 이름을 생성합니다.

대소문자를 구분하려면 테이블 이름을 tics(')로 이스케이프해야 합니다.

@Table(name = "`ITEMS_TO_REGISTER`")

해결책은 다음과 같습니다.

spring.jpa.hibernate.naming_strategy=org.hibernate.cfg.EJB3NamingStrategy

로.application.properties

독자적인 전략을 구현하여 application.properties에서 실행할 수 있습니다.

spring.jpa.hibernate.naming.physical-strategy=com.proto.CustomPhysicalNamingStrategy

항상 첫 글자를 대문자로 하는 예를 다음에 나타냅니다.

import java.io.Serializable;
import org.apache.commons.lang3.StringUtils;
import org.hibernate.boot.model.naming.Identifier;
import org.hibernate.boot.model.naming.PhysicalNamingStrategy;
import org.hibernate.engine.jdbc.env.spi.JdbcEnvironment;

public class CustomPhysicalNamingStrategy implements PhysicalNamingStrategy, Serializable {
    /**
     * Singleton access
     */
    public static final CustomPhysicalNamingStrategy INSTANCE = new CustomPhysicalNamingStrategy();

    @Override
    public Identifier toPhysicalCatalogName(Identifier name, JdbcEnvironment context) {
        return capitalize(name);
    }

    @Override
    public Identifier toPhysicalSchemaName(Identifier name, JdbcEnvironment context) {
        return capitalize(name);
    }

    @Override
    public Identifier toPhysicalTableName(Identifier name, JdbcEnvironment context) {
        return capitalize(name);
    }

    @Override
    public Identifier toPhysicalSequenceName(Identifier name, JdbcEnvironment context) {
        return capitalize(name);
    }

    @Override
    public Identifier toPhysicalColumnName(Identifier name, JdbcEnvironment context) {
        return capitalize(name);
    }

    private Identifier capitalize(Identifier name) {
        if (name == null)
            return null;
        if (name.isQuoted())
            return name;
        String text = StringUtils.capitalize(name.getText());
        return Identifier.toIdentifier(text);
    }
}

이 예에서는 H2 데이터베이스를 사용하고 있습니다.

백틱을 사용하여 테이블 이름을 "user"로 만들면 데이터베이스에서 소문자 테이블 이름이 표시됩니다.

엔티티 클래스:

여기에 이미지 설명 입력

데이터베이스의 테이블 이름:

여기에 이미지 설명 입력

추신. 엔티티의 이름을 "User"(대문자)로 지정하면 "User"(소문자)가 표시됩니다.

출처 : http://coddingbuddy.com/article/56566857/jpa-uppercase-table-names

다음 작업을 수행할 수 있습니다.

@Entity
@Table(name = "ITEMS_TO_REGISTER")
public class ItemsToRegister implements Serializable {
   ...

언급URL : https://stackoverflow.com/questions/28571848/spring-boot-jpa-insert-in-table-with-uppercase-name-with-hibernate

반응형

'IT' 카테고리의 다른 글

v-model 및 하위 구성 요소  (0) 2023.01.01
Java에서 로컬 변수 스레드가 안전한 이유  (0) 2023.01.01
Vuex + 타입 스크립트  (0) 2023.01.01
PHP에서 XMLReader를 사용하는 방법  (0) 2023.01.01
Python에서 .mat 파일 읽기  (0) 2023.01.01