JPA - Entity

hj_kwon.log·2022년 12월 7일

JPA

목록 보기
2/2
post-thumbnail

📖 JPA - Entity


📌 persistence.xml 만들기

src/main/resources에 META-INF 폴더를 생성한 후 xml을 만들어준다.

persistence.xml은 < persistence >로 시작하며 xmlns에 네임 스페이스, version에 사용할 JPA버전을 지정한다.
< persistence-unit name = "" > name에 unit의 고유한 이름을 설정한다. 일반적으로 연결한 데이터베이스당 하나의 persistence unit을 등록한다.

< 필수 속성 > 으로 데이터베이스 연결 정보를 설정하고 hibernate.dialect에 데이터베이스 dialect를 설정한다.
하이버네이트는 다양한 데이터베이스의 dialect클래스를 제공하므로 사용하는 DB의 dialect 클래스를 설정한다.

< 옵션 >

  <!-- 옵션 -->
            <!-- 콘솔에 하이버네이트가 실행하는 SQL문 출력 -->
            <property name="hibernate.show_sql" value="true"/>
            
            <!-- SQL 출력 시 보기 쉽게 정렬 -->
            <property name="hibernate.format_sql" value="true"/>
            
            <!-- 쿼리 출력 시 주석(comments)도 함께 출력 -->
            <property name="hibernate.use_sql_comments" value="true"/>
           
           <!-- JPA 표준에 맞춘 새로운 키 생성 전략 사용 -->
            <property name="hibernate.id.new_generator_mappings" value="true"/>
            
            <!-- 애플리케이션 실행 시점에 데이터베이스 테이블 자동 생성 -->
            <property name="hibernate.hbm2ddl.auto" value="create"/>
            
            <!-- 이름 매핑 전략 설정 - 자바의 카멜 표기법을 테이블의 언더스코어 표기법으로 매핑
             ex) lastModifiedDate -> last_modified_date -->
            <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>

📌 EntityManagerFactory


hello는 persistence.xml의 < persistence-unit name >과 일치시켜야 한다.
엔티티매니저팩토리(공장)에서 엔티티매니저(제품)를 찍어내는 개념이라고 보면 될 것 같다.
엔티티매니저팩토리는 엔티티매니저와 달리 여러 스레드가 동시에 접근해도 안전하다. 단순히 엔티티매니저만 찍어낸다.

📌 EntityManager

엔티티를 관리하는 역할을 수행하는 클래스이다.
엔티티 매니저 내부에 영속석 컨텍스트(Persistence Context) 를 두어서 엔티티들을 관리한다.

➡️ 엔티티 조회, 1차 캐시

Member member = new Member();

member.setId(”member1”);

member.setUsername(”회원 1);

em.persist(member);

//조회

Member findMember = em.find(Member.class, “member1”);

➡️ 데이터베이스에서 조회

Member member = new Member();

member.setId(”member1”);

member.setUsername(”회원1);

em.persist(member);

// 조회

Member findMember = em.find(Member.class, “member1”);

Member findMember2 = em.find(Member.class, “member2”);

➡️ 엔티티등록 트랜잭션을 지원하는 쓰기지연

tx.begin(); // 트랜잭션 시작

em.persist(memberA);

em.persist(memberB);

// 여기까지는 insert sql을 데이터베이스에 보내지 않는다.

// 커밋하는 순간 데이터베이스에 insert sql을 보낸다.

tx.commit();  // 트랜잭션 커밋

➡️ 엔티티 수정 변경 감지(Dirty Checking)

  • flush()가 호출되는 시점에 엔티티와 스냅샷을 전부 비교 후 변경이 된것을 감지(Dirty Checking)한 후에 update 쿼리를 작성 후, update쿼리를 날린다.
tx.begin(); // 트랜잭션 시작

// 영속 엔티티 조회

Member memberA = em.find(Member.class, “memberA”);

memberA.setUsername(”hello”);

memberA.setAge(10);

// em.update(member);

tx.commit();   // 커밋

➡️ 엔티티 삭제

// 삭제 대상 엔티티 조회

Member memberA = em.find(Member.class, “memberA”);

em.remove(memberA); // 엔티티 삭제
profile
개발자가 되는 그날까지

0개의 댓글