- "monthlySales"라는 테이블을 생성
- 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 |