Web/JPA

EP3. 영속성 컨텍스트, 엔티티 매핑

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 전략