• "monthlySales"라는 테이블을 생성

mo

  • monthlySales의 테이블과 매핑되는 Entity생성
@Data
@Entity
@Table(name = "monthlySales")
@NoArgsConstructor
public class MonthlySales {
    @Id
    private String date;
    private long sales;

    @Builder //해당 클래스의 빌더패턴 클래스를 생성
    public MonthlySales(String date, long sales) {
        this.date = date;
        this.sales = sales;
    }
}
  • 빌드는 정상적이었으나, 해당 테이블의 데이터를 조회할때 다음과 같은 에러 발생.
Hibernate: 
    /* select
        generatedAlias0 
    from
        MonthlySales as generatedAlias0 
    where
        generatedAlias0.date like :param0 escape :param1 */ select
            monthlysal0_.date as date1_1_,
            monthlysal0_.sales as sales2_1_ 
        from
            monthly_sales monthlysal0_ 
        where
            monthlysal0_.date like ? escape ?
2021-02-17 11:07:04.723  WARN 13044 --- [io-12001-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 1146, SQLState: 42S02
2021-02-17 11:07:04.725 ERROR 13044 --- [io-12001-exec-1] o.h.engine.jdbc.spi.SqlExceptionHelper   : (conn=3842) Table 'chacha.monthly_sales' doesn't exist
2021-02-17 11:07:04.788 ERROR 13044 --- [io-12001-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: could not extract ResultSet; SQL [n/a]; nested exception is org.hibernate.exception.SQLGrammarException: could not extract ResultSet] with root cause

java.sql.SQLException: Table 'chacha.monthly_sales' doesn't exist
	at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.readErrorPacket(AbstractQueryProtocol.java:1683) ~[mariadb-java-client-2.7.1.jar:na]
	at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.readPacket(AbstractQueryProtocol.java:1545) ~[mariadb-java-client-2.7.1.jar:na]
	at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.getResult(AbstractQueryProtocol.java:1508) ~[mariadb-java-client-2.7.1.jar:na]
	at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.executeQuery(AbstractQueryProtocol.java:318) ~[mariadb-java-client-2.7.1.jar:na]

 

Entity클래스에서 @Table(name="monthlySales")라고 명시해주었는데 왜 에러가 발생하는것일까?

그리고 에러 내용을 보면 monthlySales가 아닌 monthly_sales 테이블을 찾고 있었다.

 

하이버네이트에서 제공하는 ImprovedNamingStrategy를 사용하면 CamelCase 표기법을 Underscore 표기법으로 변환한다.

Spring Boot 디폴트는 org.springframework.boot.orm.jpa.SpringNamingStrategy이다.

테이블 이름의 언더바 자동 변경방지를 위해 Naming Strategy를 아래와 같이 변경해주면 된다.

 

application.properties

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

 

'자바 > JPA' 카테고리의 다른 글

SQL을 직접다룰때의 문제점  (0) 2021.02.23
Spring Boot JPA 사용을 위한 라이브러리 및 환경설정 방법  (0) 2021.02.22
JPA란  (0) 2021.02.22
ORM이란?  (0) 2021.02.22

+ Recent posts