스키마 자동생성
어플리케이션 로딩 시점에
DB의 데이블을 자동으로 생성해주는 기능이다.
이렇게 하면 개발 과정에서 따로 테이블을 만들어줘야하는 번거로움이 사라진다.
또한 데이터베이스 방언 즉 DB를 어떤 것을 쓰는지에 따라
그에 알맞는 테이블을 생성해준다.
이 기능은 개발 초기 단계에서는 쓰는 것이 유용하지만
실제 서비스를 운용하거나 테스트하는 단계에서는 쓰면 굉장히 위험하다.
DB 스키마 자동생성 속성
테스트 객체
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
@Entity
public class Member {
@Id
private Long id;
private String name;
public Member() {
}
public Member(Long id, String name) {
this.id = id;
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
create
기존 테이블을 삭제 후 다시 생성한다.
persistence.xml
에서
1
<property name="hibernate.hbm2ddl.auto" value="create" />
실행결과 콘솔
1
2
3
4
5
6
7
8
9
10
Hibernate:
drop table Member if exists
Hibernate:
create table Member (
id bigint not null,
name varchar(255),
primary key (id)
)
만약 객체에 새로운 값을 추가한다면
1
2
3
4
@Id
private Long id;
private String name;
private Long age;
1
2
3
4
5
6
create table Member (
id bigint not null,
age bigint,
name varchar(255),
primary key (id)
)
재실행시에 다시 반영이 된다.
create-drop
create와 기능이 같으나 종료시점에 테이블을 drop한다.
1
<property name="hibernate.hbm2ddl.auto" value="create-drop" />
1
2
3
Hibernate:
drop table Member if exists
이후 DB를 확인해보면 테이블이 삭제된 것을 확인할 수 있다.
update
변경된 부분만 반영한다.
테이블을 대체
1
<property name="hibernate.hbm2ddl.auto" value="update" />
1
2
3
4
5
@Id
private Long id;
private String name;
private Long age;
private Long age2;
age2라는 값을 추가하고 실행시키면
1
2
3
4
Hibernate:
alter table Member
add column age2 bigint
age2라는 새로운 column이 추가된다.
만약 age2를 지우고 다시 실행시키면 어떻게 될까?
update에서는 추가만 가능하고 삭제는 안되기 때문에 변화가 없다.
validate
엔티티와 테이블이 정상적으로 매핑되었는지 확인한다.
1
<property name="hibernate.hbm2ddl.auto" value="validate" />
1
2
3
4
@Id
private Long id;
private String name;
private Long age3;
DB테이블에 없는 age3를 만들고 실행시켜보면
1
Schema-validation: missing column [age3] in table [Member]
테이블에 age3가 없다고 오류가 뜨는 것을 확인할 수 있다.
none
스키마 자동생성 기능을 사용하지 않을 때 사용
주석처리를 하는 것과 동일하다.
1
<property name="hibernate.hbm2ddl.auto" value="none" />