[H2] Column이 drop 되지 않음 | JPA Bean을 직접 주입하는 실습 중

2023. 1. 25. 21:42·Database

⭐ 설정파일을 잘못 작성 (create-drop의 위치)

 

문제 원인

: jpa 설정을 JpaProperties에서 가져왔기 때문에,

jpa의 create-drop 설정은 jpa의 properties 아래에 둬야 의도에 맞다.

 

 

∴  JpaProperties에서 설정을 가져올 때의 ddl auto 설정의 올바른 위치:

jpa:
  properties:
      hbm2ddl:
        auto: create-drop

 

∨ create-drop이 jpa의 properties 아래로 가야 한다. 

∨ JPA에 필요한 Bean을 직접 주입하는 실습이었다. 접은글의 코드를 보면, 위와 같은 jpa설정을 JpaProperties에서 가져오고 있다.

더보기
아래 코드를 보면 JpaProperties에서 정보를 가져옴을 알 수 있다. 

@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory(DataSource dataSource, JpaVendorAdapter jpaVendorAdapter,
                                                                       JpaProperties jpaProperties) {
    LocalContainerEntityManagerFactoryBean em = new LocalContainerEntityManagerFactoryBean();
    em.setDataSource(dataSource);
    em.setPackagesToScan("com.example.demo.domain");
    em.setJpaVendorAdapter(jpaVendorAdapter);
    
    Properties properties = new Properties();
    properties.putAll(jpaProperties.getProperties());
    em.setJpaProperties(properties);

    return em;
}

 

∨ 하지만 수정 전에는 jpa 바로 아래에 create-auto 설정을 뒀다.

  그래서 created-auto 설정이 먹히지 않았던 것이다.

// 수정 전!
jpa:
  generate-ddl: true
  hibernate:
    ddl-auto: create-drop

 

 

아래는 문제 해결 전 고민한 내용이다.

이유를 찾지 못해서 결국 임시방편으로 해결하고 넘겼던..

 

결론은 create-drop가 안 읽히는 위치에 있는게 문제였다.

drop 로그가 안 보였던 것이 당연하다.

 

 

 


🚨문제점

 

AGE컬럼은 이전 실습에서 만든 컬럼이다.

예상대로라면 AGE 컬럼은 없어야 한다.

- hibernate의 ddl-auto 설정이 create-drop이기 때문이다.

- 그리고 h2 db는 휘발성이라서 application을 재구동하면 초기화되어야 한다고 생각했다.

 

없어야 할 AGE 컬럼뿐만 아니라, 이전에 생성해둔 불필요한 컬럼도 drop되지 않는다. 

(참고: 이전에 시험삼아 jpa Entity 컬럼명을 snack case로 변경하여 넣도록 했었음)

 

아래 컬럼에서 불필요한 컬럼은 AGE, FIRST_NAME, LAST_NAME의 3가지이다.

- 지금 Entity에 정의되어있지 않은 컬럼인데 왜 create-drop 설정이 안 먹힐까?

- 왜 create-drop 되지 않을까? 

(로그에서 drop을 실패했다는 부분도 발견하지 못했음)

 

 

이유를 찾지 못했다.

일단 실습은 진행해야해서 저 컬럼을 손수 지워주었다.

 

 


🚨 직접 컬럼을 삭제해줌 ㅠㅡㅠ

 

그래서 '왜 컬럼이 drop되지 않지..'는 일단 미스테리로 두었다.

 

일단 H2 console에서 직접 drop했다.

실습을 이어 진행할 수 있도록 말이다.

 

 

서버를 재구동하여 컬럼을 정상화하고..

컬럼이 Entity대로 잘 등록되었다.

 

 

 

 


❗참고 : 문제해결의 발단

 

repository.save(entity)할 때 아래 에러가 발생했었다.

NULL not allowed for column "AGE"; SQL statement:

 

AGE는 예전 실습에서 만든 컬럼인데.. 왜 아직도 있는겨?

그래서 작성하게 된 글임!

 

 

반응형

'Database' 카테고리의 다른 글

Docker Mysql Container의 sql 파일 꾸준히 백업: crontab 사용  (0) 2024.01.04
[DB] 인덱스 사용 이유 이해하기  (0) 2023.10.17
mysql 서버 상태 확인하기(show status) | db connection 전후 Threads 관련 상태변수 확인  (1) 2023.01.11
[DB] 상속 관계 매핑 전략 선택하기  (2) 2022.12.30
ObjectInputStream | file에 이어쓰기로 writeObject 후 readObject하려할 때 object를 못읽는 문제  (0) 2022.12.28
'Database' 카테고리의 다른 글
  • Docker Mysql Container의 sql 파일 꾸준히 백업: crontab 사용
  • [DB] 인덱스 사용 이유 이해하기
  • mysql 서버 상태 확인하기(show status) | db connection 전후 Threads 관련 상태변수 확인
  • [DB] 상속 관계 매핑 전략 선택하기
히어로맛쿠키
히어로맛쿠키
  • 히어로맛쿠키
    yeny_lab
    히어로맛쿠키
  • 전체
    오늘
    어제
    • 분류 전체보기 (389)
      • 미분류글 (32)
        • ㅇ (2)
      • JAVA (84)
        • Effective Java (1)
        • Application (21)
      • 컴퓨터구조 & OS (28)
      • 자료구조 + 알고리즘 (43)
      • Database (12)
      • 컴파일러 (10)
      • 수학 (33)
        • 미분방정식 (12)
      • 데이터분석과 머신러닝 (38)
      • 기타 (59)
      • yyeeennyy (25)
  • 공지사항

    • ^o^/♡
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
히어로맛쿠키
[H2] Column이 drop 되지 않음 | JPA Bean을 직접 주입하는 실습 중
상단으로

티스토리툴바