Jpa-영속성과 엔티티

1 분 소요

영속성 관리

  • 보통 em은 트랜젝션이 시작할 때 데이터베이스 커넥션을 얻는다.

  • 엔티티(@Entity)의 생명주기

    1. 비영속
    2. 영속
    3. 준영속
    4. 삭제
    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를 실행하면 생기는 일
      1. 영속성 컨텍스트에 있는 모든 엔티티를 스냅샷과 비교해서 수정된 엔티티를 찾고 수정쿼리를 만들어 SQL쿼리저장소에 등록한다.
      2. 이후 SQL쿼리저장소에 있는 모든 쿼리문들을 데이터베이스에 전송한다. (등록, 수정, 삭제)
    • FLUSH하는 방법 3가지
      1. em.flush()를 직접 호출
      2. 트랜젝션 커밋 시 플러시가 자동 호출 → 가장 일반적
      3. 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
        • 선택한 데이터베이스 방언에 따라 맞춰서 자동으로 해주는거

카테고리:

업데이트:

댓글남기기