자동 DDL 쿼리 생성
JPA에는 설정한대로 자동으로 DDL 쿼리를 짤 수 있도록 설정할 수 있다.
사용 방법
persistence.xml에
<property name="hibernate.hbm2ddl.auto" value="create" />을 추가하면 된다.
value = "create"일 때 작동 방식
1. drop table if exists - 기존에 table존재하면 삭제
2. create table Member... - 테이블 생성
create가 아닌 다른 값인 경우
value:
- "create-drop": create처럼 생성하고 종료시점엔 table drop
- "update": 변경분만 반영(sql의 alter 명령어와 같음)
- "validate": 엔티티와 테이블이 정상적으로 매핑되었는지만 확인
- "none": 사용하지 않음
사용 편의와 로직
-> 애플리 케이션 로딩시점에 설정한 Dialect DB에 따라 DDL 생성이 가능하다.
-> DDL을 애플리케이션 실행시점에 자동생성 가능
-> 단, 이렇게 생성된 DDL은 개발장비에서만 사용
-> 테이블 중심 -> 객체 중심
-> DDL은 운영서버에서는 사용하지 않거나 적절히 다듬은 후 사용
주의: create, create-drop, update는 운영장비에 절대 쓰면 안된다. 개발 초기단계에는 create, update 가능, 테스트 서버에서는 update와 validate 가능 -> 그러나, 절대 create 사용하면 안됨 그럼 데이터 싹다날라감. 그 이후는 거의 쓰지말길 권고
익셉션:
Caused by: org.h2.jdbc.JdbcSQLSyntaxErrorException: Table "MEMBER" already exists; SQL statement:
만약 value="create"로 설정햇는데 계속 이런 에러가 발생한다면
https://www.inflearn.com/questions/17219 링크를 참조해서 해결해도 되고, 근본적인 해결이 어렵다면 H2 SQL에서
DROP TABLE ITEMS CASCADE;
DROP TABLE MEMBERS CASCADE;
DROP TABLE ORDERITEMS CASCADE;
DROP TABLE ORDERS CASCADE;
를 직접 입력하여 삭제하는 것이 편하다. 설정한대로 drop table을 할 때 연관된 외부키 Constraints가 있어서 삭제가 안되서 익셉션이 발생하는 것 같은데, 이럴경우 H2에서 직접 cascade로 연관된 Constraints까지 다 삭제하는 것이 깔끔하다 생각한다.
(2021.07.17 수정!!! : hibernate 버전을 5.4.13.Final으로 H2 데이터베이스의 버전을 1.4.199로 설정하니 해결되었다.)
필드와 컬럼 매핑
@Column 어노테이션(DB 속성에 조건을 추가)과 속성
@Column(name = "USERNAME")
@Column(nullable = true, updatable = true) => 자주쓰임
@Column(unique = true) => 잘 안쓰임. 왜냐 Constraint명이 너무 복잡스럽게 생성되기 때문에
=> @Table(uniqueConstraints = "제약명") 선호
@Column(length = 10)
@Column(ColumnDefinition = "varchar(100) default 'EMPTY'")
컬럼의 속성에 따른 기능은 sql의 지식이 어느정도 있다면 다 이해할 수 있을 것이라고 판단한다.
@Enumerated
열거형 자료형인 경우 사용, 열거형 자료형은 서로 관련있는 상수들기리 모아 상수를 정의하는 것으로 생각하면 됨. 예를들면 성적-> A(에이), B(비), C(C) 같은 경우
참고:https://mine-it-record.tistory.com/204
@Enumerated(EnumTyoe.ORDINAL): enum의 인덱스 번호를 DB에 저장(integer)
@Enumerated(EnumType.STRING): enum 이름을 DB에 저장(String)
=> 보통은 메모리 조금 써서 String으로 쓰는 것이 낫다. 왜냐하면 Ordinal 했다가 열거형 데이터가 추가되어 순서가 뒤죽박죽 되었을 때의 위험이 너무 크기 때문이다.
@Temporal
LocalDate, LocalDateTime 자료형을 쓰는 경우는 따로 어노테이션 붙일 필요가 없음
temporal은 시간의 라는 형용사, 시간관련 Date 자료형을 사용하는 경우 사용
@Lob
자료형이 String이면 BLOB, 나머지는 CLOB 자료형의 Column으로 매핑
lob 뜻: 구조화되지 않은 용량이 큰 데이터를 저장할 수 있는 데이터 타입이라고 한다.
따로 속성은 없다.
@Transient
Transient: 일시적인 순간적인
이 어노테이션이 붙은 필드는 DB의 Column으로 사용되지 않음
개발자가 db의 column에 따로 저장하지 않고 계산을 한다던가 일시적으로 사용하고 싶은 변수일 때 사용
DDL 자동 생성할 때만 실행되고 JPA 실행 로직에는 영향을 주지 않는다.
기본 키 매핑
- @Id => Java단에서 키로 지정할 콜럼을 직접 지정하는 것이다.
- @GeneratedValue => 기본키를 어떻게 만들 것인가 ?
@GeneratedValue(strategy = "GenerationType.XXX") 의 strategy속성 값에 따른 기본키 특성파악
1. IDENTITY (나는 모르겠고 DB니가 알아서 해줘)
-> DB에 기본키 특성 위임
ex) MySQL의 AUTO_INCREMENT-> commit 이후에 Insert SQL 쿼리를 날린 후에 ID값을 알 수 있다.
2. Sequence (DB의 시퀸스 오브젝트 사용, Oracle)
-> 시퀸스 제너레이터를 만들어서 명칭을 정할 수 있음 (@SquenceGenerator 필요)
3. Table (키 생성용 테이블을 만듬, 모든 DB 가능)-> 똑같이 @TableGenerator로 만들 수 있음
4. Auto (DB 종류와 Dialect에 따라 자동 지정, 기본값임)
이 게시물은 '자바 ORM 표준 JPA 프로그래밍' 강의를 수강하고 정리한 내용임을 밝힙니다.
출처: https://www.inflearn.com/course/ORM-JPA-Basic#
자바 ORM 표준 JPA 프로그래밍 - 기본편 - 인프런 | 강의
JPA를 처음 접하거나, 실무에서 JPA를 사용하지만 기본 이론이 부족하신 분들이 JPA의 기본 이론을 탄탄하게 학습해서 초보자도 실무에서 자신있게 JPA를 사용할 수 있습니다., 본 강의는 자바 백엔
www.inflearn.com