Jpa-영속성과 엔티티
영속성 관리
-
보통 em은 트랜젝션이 시작할 때 데이터베이스 커넥션을 얻는다.
-
엔티티(@Entity)의 생명주기
- 비영속
- 영속
- 준영속
- 삭제
em.persist(member);
- 위 코드는 em을 사용해서 회원 엔티티와 해당 엔티티의 PK를 영속성 컨텍스트에 있는 1차 캐시에 key, value방식으로 저장한다는 뜻이다.
- 위 코드로 인해 Member 엔티티는 영속상태가 된 것이다.
- 영속상태란? 해당 엔티티를 영속성 컨텍스트에 저장해서 관리한다는 뜻
-
em.find()나 JPQL을 사용하는 대상은 전부 영속상태여야한다.
-
영속성 컨텍스트에 엔티티를 저장하면 이 엔티티는 언제 테이블로 바뀌어서 데이터베이스에 저장이 될까? → 보통 트랜젝션이 커밋되는 순간 SQL쿼리저장소에 있던 쿼리문들이 데이터베이스로 날라가면서 그 순간 저장이 된다. 이걸 flush라고 한다. (커밋 전에는 앞에 말했듯이 1차 캐시에 pk와 엔티티.class가 저장되어 있어 이걸 통해 비즈니스로직에서 데이터베이스 커넥션없이 조회한다.)(em.find(Member.class, 1L)) → 성능상 이점
-
엔티티를 영속성 컨텍스트에 맨 처음 저장할 때 스냅샷을 찍는데 트랜젝션 커밋할 때 만약 스냅샷과 비교하여 변경사항이 있으면 UPDATE문을 SQL쿼리저장소에 넣고 바로 데이터베이스에 보낸 후 커밋한다. 이러한 변경감지 기능은 영속성 컨텍스트에서 관리하는 영속 상태의 엔티티에만 적용된다.
- FLUSH란?
- 영속성 컨텍스트의 변경내용을 데이터베이스에 반영(동기화)하는 기능
- FLUSH를 하면 SQL쿼리저장소에 있는 쿼리문들이 데이터베이스로 넘어가는 것 뿐이지 1차캐시에 보관되어있는 엔티티들을 없애는 것이 아니다.
- FLUSH를 실행하면 생기는 일
- 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교해서 수정된 엔티티를 찾고 수정쿼리를 만들어 SQL쿼리저장소에 등록한다.
- 이후 SQL쿼리저장소에 있는 모든 쿼리문들을 데이터베이스에 전송한다. (등록, 수정, 삭제)
- FLUSH하는 방법 3가지
- em.flush()를 직접 호출
- 트랜젝션 커밋 시 플러시가 자동 호출 → 가장 일반적
- JPQL 쿼리 실행 시 플러시가 자동 호출
엔티티 매핑
// 엔티티-테이블
@Entity
@Table(name = “orders”,
uniqueConstraints = {
@UniqueConstraint(name = "NAME_AGE_UNIQUE",
columnNames = {"name", "age"})
}
)
// 필드-컬럼
@Id
@Column(name = "id", nullable = false, length = 10)
@Enumerated(EnumType.STRING)
@Temporal(TemporalType.TIMESTAMP)
@Lob
<property name="hibernate.hbm2ddl.auto" value="create" />
<property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
-
위 코드는 persistence.xml에서 설정코드인데 첫번째는 자동으로 테이블 create, drop가능하게 해주는거고 두번째는 자바의 카멜표기법 필드를 테이블의 언더스코어표기법 컬럼으로 자동 변경해주는 기능이다.
-
PK(Primary Key) 매핑
- 직접 할당 → 말그대로 @Id만 사용해서 직접 .setId(“id1”) 이런 식으로 직접 할당해주는 방법
- 자동 생성 → @Id도 쓰고 추가로 @GeneratedValue도 써서 따로 할당을 안해도 자동으로 pk가 등록되도록 하는 방법이다.
- IDENTITY
- 이건 mysql, postgresql, sql server에서 쓰는 전략
- 기본 키 생성을 데이터베이스에게 위임한다. (mysql → auto_increment)
- SEQUENCE
- oracle이나 h2 database 등에서 쓰는 전략
- TABLE
- 키 생성 전용 테이블을 만들어서 쓰는 시퀀스 비스무리한거
- AUTO
- 선택한 데이터베이스 방언에 따라 맞춰서 자동으로 해주는거
- IDENTITY
댓글남기기