⚡ 생각대로 살지 않으면 사는대로 생각한다.
⚡ 나는 어차피 잘 될 놈이다. 이미 잘 되고 있고, 계속해서 잘 되고 있다.
Persistence
가META-INF/persistence.xml
애서 설정 정보를 조회하고,EntityManagerFactory
를 통해서EntityManager
를 생성한다.
❗혹시 자바 버전을 11로 설정하고, 강의 진행처럼 되지 않으면서 문제가 생긴다면,
pom.xml
을 다음과 같이 설정하면 된다.!<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>jpa-basic</groupId> <artifactId>ex1-hello-jpa</artifactId> <version>1.0.0</version> <dependencies> <dependency> <groupId>javax.xml.bind</groupId> <artifactId>jaxb-api</artifactId> <version>2.3.0</version> </dependency> <!-- JPA 하이버네이트 --> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-entitymanager</artifactId> <version>5.3.10.Final</version> </dependency> <!-- H2 데이터베이스 --> <dependency> <groupId>com.h2database</groupId> <artifactId>h2</artifactId> <version>1.4.199</version> </dependency> </dependencies> <properties> <maven.compiler.source>11</maven.compiler.source> <maven.compiler.target>11</maven.compiler.target> </properties> </project>
✅JPA에는 트랜잭션 단위가 굉장히 중요하다!
- 데이터를 변경하는 모든 작업은 트랜잭션 안에서 작업해줘야 한다.
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
/* */
부분이 생기는 이유.필수 애너테이션
- @Entity
- Persistance의 Entity 표시
- class 레벨
- @Id
- PK를 알려줌
- field 레벨
- @Table
- 어떤 테이블과 매핑할건지 지정
- field 레벨
- @Column
- 속성과 컬럼을 매핑해줌.
- field 레벨
createEntityManagerFactory의 매개변수에는 persistence.xml
의 persistance unit name
을 지정하여 EntityManagerFactory
인스턴스를 생성한다.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManagerFactory를 통해서 EntityManager를 생성한다
EntityManagerFactory는 하나만 생성해서 애플리케이션 전체에서 공유
EntityManager는 트랜잭션 단위마다 만들어줘야 한다.
EntityManager em = emf.createEntityManager();
EntityManager는 쓰레드간에 공유하면 안 된다.
close()
메서드로 닫고 버려줘야한다.JPA의 모든 데이터 변경은 트랜잭션 안에서 수행되어야 한다.
트랜잭션을 얻는 코드
EntityTransaction tx = em.getTransaction();
트랜잭션을 시작하는 코드
tx.begin();
트랜잭션을 커밋하는 코드
tx.commit();
트랜잭션을 롤백하는 코드
tx.rollback();
em.persist(인스턴스);
em.find(Member.class, 1L); // 클래스이름, PK(기본키, @Id)
em.remove(인스턴스);
Member findMember = em.find(Member.class, 1L); // 멤버 찾고,
findMember.setName("HelloJPA"); // 찾은 멤버 수정
// 이 때, persist하지 않아도 된다!
애플리케이션이 끝나면, EntityManager
를 꺼줘야한다. EntityManager
가 내부적으로 데이터베이스 커넥션을 물고 동작하는데, 어쨌든 반드시 사용을 끝내줘야한다.
em.close();
웹 어플리케이션이라면, WAS가 내려갈 때, 애플리케이션이 종료될 때, EntityManagerFactory를 닫아줘야한다.
emf.close();
-끝-