- DDL을 애플리케이션 실행 시점에 자동 생성(Create문으로 생성을 하고 시작)
- 테이블 중심 -> 객체 중심
- 데이터베이스 방언을 활용해서 데이터베이스에 맞는 적절한 DDL 생성
- 이렇게 생성된 DDL은 개발 장비에서만 사용
- 생성된 DDL은 운영서버에서 사용하지 않고 다음어서 사용
매핑정보를 보면 어떤테이블인지 알 수가 있는데 JPA에서는 애플리케이션 로딩 시점에 DB를 생성하는 기능도 지원해준다.
애플리케이션 실행시점에 Insert Into같은 것들을 실행시켜주는것이다.
아래와 같이 설정 해두고 실행 시키면 빌드창에서
drop 문구를 생성해주고 create table을 하고 로직이 돈다.
-- persistence.xml에 아래와 같이 속성을 두게되면
<properties>
<property name="hibernate.hbm2ddl.auto" value="create" />
</properties>
age라는 변수를 추가로 지정해주고 빌드를 돌려서 h2 db에서 확인을 해주면 컬럼이 추가가 된다.
보통 같으면 코드를 추가하고 db상에서 create table ~~를 따로 적어줘야 했었지만 JPA같은 경우는 매우 편리하다.
@Entity
@Table(name = "MBR")
public class Member {
@Id
private Long id;
private String name;
private int age;
create-drop를 하게되면 drop - select - drop순으로 빌드가 된다.
Hibernate:
drop table MBR if exists
Hibernate:
select
member0_.id as id1_5_0_,
member0_.age as age2_5_0_,
member0_.name as name3_5_0_
from
MBR member0_
where
member0_.id=?
Hibernate:
drop table MBR if exists
update는 추가하는 경우만 생기고
validate는 없는 엔티티가 있게되면 에러를 찍어준다.
@Entity
@Table(name = "MBR")
public class Member {
@Id
private Long id;
private String name;
private int gogo2;
public Member() {
}
Caused by: org.hibernate.tool.schema.spi.SchemaManagementException: Schema-validation: missing column [gogo2] in table [MBR]
데이터베이스 방언별로 달라지는 것을 확인하면(persistence.xml의 property를 아래와 같이 설정)
(oracle은 가변문자 기본이 varchar(2)로 되어있음 varchar(2)로 생성)
<property name="hibernate.dialect" value="org.hibernate.dialect.Oracle12cDialect"/>
<!-- 옵션 -->
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
<property name="hibernate.jdbc.batch_size" value="10"/>
<property name="hibernate.hbm2ddl.auto" value="create" />
create 할 때 보면 varchar2로 되어있다.
Hibernate:
create table Member (
id number(19,0) not null,
gogo2 number(10,0) not null,
name varchar2(255 char),
TEAM_ID number(19,0),
primary key (id)
)
아래사항을 주의하자.
- 운영 장비에는 절대 create, create-drop, update 사용하면 안된다.
- 개발 초기 단계에서 create 또는 update
- 테스트 서버에는 update 또는 validate
- 스테이징과 운영 서버는 validate 또는 none
@Column을 적을 수가 있는데
@Entity
public class Member {
@Id
private Long id;
// column을 주고 실행을 시켜주면
@Column(unique = true, length = 10)
private String name;
private int gogo2;
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 name() {
return name;
}
public void setName(String name) { this.name = name; }
}
build를 보게되면 varchar(10)이 들어가있고 alter로 해서 unique 제약조건이 생기게 된다.
unique같은경우는 JPA에 실행 매커니즘에는 영향을 주지않고 alter script가 한번 생성되거나 실행이 되는 것이다.
Hibernate:
create table Member (
id bigint not null,
gogo2 integer not null,
name varchar(10),
TEAM_ID bigint,
primary key (id)
)
alter table Member
add constraint UK_ektea7vp6e3low620iewuxhlq unique (name)
이런것이 아래에 DDL 생성기능이다.
- 제약조건 추가 : 회원 이름은 필수, 10자 초과 x
- @Column(nullable = false, length = 10)
- DDL 생성 기능은 DDL을 자동 생성할 때에만 사용되고 JPA의 실행 로직에 영향을 주지 않는다.
<출처 김영한: 자바 ORM 표준 JPA 프로그래밍 - 기본편 >
https://www.inflearn.com/course/ORM-JPA-Basic/dashboard
'Spring > JPA' 카테고리의 다른 글
기본 키 매핑 (0) | 2022.04.14 |
---|---|
필드와 컬럼 매핑 (0) | 2022.04.14 |
엔티티 매핑 - 객체와 테이블 매핑 (0) | 2022.04.14 |
지연 로딩과 조회 성능 최적화 - 엔티티를 DTO로 변환(페치 조인 최적화) ERROR (0) | 2022.04.12 |
플러시 & 준영속 상태 정리 (0) | 2022.04.12 |