

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"/>

hello는 persistence.xml의 < persistence-unit name >과 일치시켜야 한다.
엔티티매니저팩토리(공장)에서 엔티티매니저(제품)를 찍어내는 개념이라고 보면 될 것 같다.
엔티티매니저팩토리는 엔티티매니저와 달리 여러 스레드가 동시에 접근해도 안전하다. 단순히 엔티티매니저만 찍어낸다.
엔티티를 관리하는 역할을 수행하는 클래스이다.
엔티티 매니저 내부에 영속석 컨텍스트(Persistence Context) 를 두어서 엔티티들을 관리한다.

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(); // 트랜잭션 커밋
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); // 엔티티 삭제