데이터베이스 방언
• JPA는 특정 데이터베이스에 종속 X
• 각각의 데이터베이스가 제공하는 SQL 문법과 함수는 조금씩 다름
• 가변 문자: MySQL은 VARCHAR, Oracle은 VARCHAR2
• 문자열을 자르는 함수: SQL 표준은 SUBSTRING(), Oracle은 SUBSTR()
• 페이징: MySQL은 LIMIT , Oracle은 ROWNUM
• 방언: SQL 표준을 지키지 않는 특정 데이터베이스만의 고유한 기능
• hibernate.dialect 속성에 지정
• H2 : org.hibernate.dialect.H2Dialect
• Oracle 10g : org.hibernate.dialect.Oracle10gDialect
• MySQL : org.hibernate.dialect.MySQL5InnoDBDialect
• 하이버네이트는 40가지 이상의 데이터베이스 방언 지원
JPA 구동 방식
앤티티 매니저 팩토리 생성
Persistence 클래스를 사용하여앤티티 매니저 팩토리를 생성하여 JPA를 사용할 수 있게 준비한다.
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpa");
JPA구현체에 따라서는 데이터베이스 커넥션 풀도 생성하므로 엔티티 매니저 팩토리를 생성하는 비용은 크다.
따라서 앤티티 매니저 팩토리는 애플리케이션 전체에서 딱 한 번만 생성하고 공유해서 사용해야 한다 !
앤티티 매니저 생성
EntityMAnagerFactory em = emf.createEntityManager();
JPA의 기능 대부분은 엔티티 매니저가 제공한다.
대표적으로 앤티티 매니저를 사용해서 데이터베이스에 등록/수정/삭제 /조회 할 수 있다.
종료
마지막으로 사용이 끝난 엔티티 매니저는 반드시 종료해야한다.
em.close();
에플리케이션을 종료할 때 엔티티 매니저 팩토리도 다음처럼 종료해야 한다.
emf.close();
객체와 테이블을 생성하고 매핑하기
• @Entity: JPA가 관리할 객체
• @Id: 데이터베이스 PK와 매핑
package datajpa.datajpa.domain;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;
@Entity
@Getter
@Setter
@ToString
public class Member {
@Id
@GeneratedValue
private Long id;
private String username;
}
DDL
create table Member (
id bigint not null,
name varchar(255),
primary key (id) );
• 회원 등록
• 회원 수정
• 회원 삭제
• 회원 단 건 조회
public class JpaMain {
public static void main(String[] args) {
//엔티티 매니저 팩토리 생성
EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
EntityManager em = emf.createEntityManager(); //엔티티 매니저 생성
EntityTransaction tx = em.getTransaction(); //트랜잭션 기능 획득
try {
tx.begin(); //트랜잭션 시작
logic(em); //비즈니스 로직
tx.commit();//트랜잭션 커밋
} catch (Exception e) {
e.printStackTrace();
tx.rollback(); //트랜잭션 롤백
} finally {
em.close(); //엔티티 매니저 종료
}
emf.close(); //엔티티 매니저 팩토리 종료
}
public static void logic(EntityManager em) {
String id = "id1";
Member member = new Member();
member.setId(id);
member.setUsername("지한");
member.setAge(2);
//등록
em.persist(member);
//수정
member.setAge(20);
//한 건 조회
Member findMember = em.find(Member.class, id);
System.out.println("findMember=" + findMember.getUsername() + ", age=" + findMember.getAge());
//목록 조회
List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList();
System.out.println("members.size=" + members.size());
//삭제
em.remove(member);
}
}
'JPA > JPA 기본' 카테고리의 다른 글
JPA-고급 매핑 (0) | 2022.04.28 |
---|---|
JPA-다양한 연관관계 매핑 (0) | 2022.04.28 |
JPA-연관관계 매핑 기초 (0) | 2022.04.28 |
JPA-엔티티 매핑 (0) | 2022.04.27 |
JPA-영속성 관리 (0) | 2022.04.27 |