em.flush(); 를 하면 영속성 컨텍스트의 변경내용을 데이터베이스에 동기화 한다.
(sql저장소에 있던 sql문들이 db로 날아간다.)
영속성 컨텍스트를 비우는 것은 아님!
- 커밋을 실행하면 : flush()를 자동호출한다. ( = 쿼리가 db로 날아간다 )
- JPQL을 실행하면 : flush()를 자동호출한다. ( = 쿼리가 db로 날아간다 )
준영속 상태 : 한번 영속상태였다가 비영속상태가 되었을 때.
영속 -> 준영속
em.detach() : 특정 엔티티만 준영속 상태로 전환
em.clear() : 영속성 컨텍스트를 완전히 초기화
em.close() : 영속성 컨텍스트를 종료
영속성 컨텍스트의 이점
- 1차 캐시
- 동일성 보장
- 쓰기 지연
- 변경감지
- 지연로딩
엔티티 매핑
객체 : @Entity
테이블 : @Table
필드, 컬럼 : @Column
기본 키 : @Id
연관관계 매핑 : @ManyToOne, @JoinColumn
@Entity
- 기본 생성자 필수
- final 클래스, enum, interface, inner 클래스 사용 X
- 저장할 필드에 final X
- 옵션 : name -> 테이블 이름 지정가능
DDL : 운영서버에서 사용할 시에는 다듬어서 사용하기
스키마 자동생성
<property name="hibernate.hbm2ddl.auto" value="=====" />
운영 장비에는 create, create-drop, update 사용하지 말자!
(update는 왜? alter가 나가면 데이터베이스가 lock이 걸린다.)
개발 초기 단계 | create, update |
테스트 서버 | update, validate |
스테이징, 운영서버 | validate, none |
엔티티 매핑 어노테이션
<property name="hibernate.hbm2ddl.auto" value="create" />
어노테이션 | 설명 |
@Column | 컬럼 매핑 |
@Temporal | 날짜타입 매핑 |
@Enumerated | enum 타입 매핑 |
@Lob | BLOB, CLOB 매핑 |
@Transient | 특정필드를 컬럼에서 제외 |
@Column
속성 | 설명 | 기본값 |
name | 필드와 매핑할 테이블의 컬럼 이름 | 객체의 필드 이름 |
insertable, updatable |
등록, 변경 가능 여부 | TRUE |
nullable(DDL) | null 값의 허용 여부를 설정한다. false로 설정하면 DDL 생성시에 not null 제약조건이 붙는다. | |
unique(DDL) | @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용한다. | |
columnDefinition(DDL) | 데이터베이스 컬럼 정보를 직접 줄 수 있다. ex) varchar(100) default 'EMPTY' |
필드의 자바타입과 방언정보를 사용해 |
length(DDL) | 문자 길이 제약조건, String 타입에만 사용한다. | 255 |
precision, scale(DDL) |
BigDecimal 타입에서 사용한다(BigInteger도 사용할 수 있다.) precision은 소수점을 포함한 전체 자 릿수를, scale은 소수의 자릿수다. 참고로 double, float 타입에는 적용되지 않는다. 아주 큰 숫자나 정밀한 소수를 다루어야 할 때만 사용한다. |
precision=19, scale=2 |
@Enumerated
EnumType.STRING 만 사용한다.
날짜는 이렇게 쓰면 된다. 어노테이션 없이.
private LocalDate testLocalDate; -> DB의 date 타입으로 전환
pricate LocalDateTime testLocalDateTime; -> DB의 timestamp 타입으로 전환
@Lob
문자는 clob,
나머지는 blob 으로 매핑된다.
*Lob의 뜻
Large Object의 줄임말로 커다란 파일을 넣을 때 사용한다.
ex) 이미지, 영상, 사운드 등
@Transient
: DB에 매핑하지 않고 메모리상에서만 쓸때
기본키 매핑
전략 4개
- IDENTITY 전략 : 데이터베이스에 그냥 하나씩 올리라고 위임 , em.persist(entity) 시점에 쿼리가 날아간다.
- SEQUENCE 전략 : 데이터베이스 시퀀스 오브젝트를 사용해서 DB로부터 next value를 하나씩 가져온다.
em.persist(entity) 시점에서 시퀀스테이블에서 next_value를 데이터베이스에서 가져온다.
-> 성능문제 우려
그래서 성능 최적화 방법
한번에 50개 증가로 해놓으면 처음에 next value 1 호출, 그리고 next value를 한번 더 불러서 50증가한 51을 가져와 놓음.
그리고 51을 만날때 까지 메모리상에서 50까지 할당하고 51만나면 next value 한번 더 호출해서 101을 만든다. - TABLE 전략
- AUTO 전략
'Web > JPA' 카테고리의 다른 글
EP6. 연관관계 매핑 (실전예제) (0) | 2021.02.06 |
---|---|
EP5. 연관관계 매핑 (0) | 2021.02.05 |
EP4. 요구사항 분석과 기본 매핑 (0) | 2021.02.04 |
EP2. JPA 기본동작과정과 내부동작방식 (0) | 2021.02.03 |
EP1. JPA 개념과 개발환경 세팅 (0) | 2021.02.02 |