반응형
객체 매핑
Table 구조와 객체
- mysql table 구조
create table User (
id varchar(255) not null,
name varchar(255),
age integer,
primary key(id)
);
- JPA Entity class
@Getter
@Entity
@Table(name="users")
public class User {
@Id
private String id;
private String name;
private Integer age;
}
JPA Entity Annotation
- @Entity
- class를 table과 mapping 한다고 JPA에서 알려주는 기능
- @Entity가 붙으면 Entity class라고 부른다
- @Table
- mapping할 DB table정보를 설정
- name : table명 변경 가능, default : class 소문자 명
- @Id
- pk를 설정
- 식별자 필드라고 한다
- @Column
- Entity class의 필드 값을 DB 컬럼에 Mapping해준다
- name을 통해서 column명 수정 가능
- 이 annotation이 없으면 필드명이 column명이 된다
- ex) numberOfDay -> number_of_day
DB 방언
- 방언의 발생 : DB는 표준이 정해져 있지 않고, 동일한 기능에 대해서 회사마다 코드가 일부분 다름
- 방언 예시
- 데이터 타입 : mysql - varchar, oracle - varchar2
- 함수명 : mysql - substring(), oracle - substr()
- paging 처리 : mysql - limit, oracle - rownum
- 방언 설정
- H2 : org.hibernate.dialect.H2Dialect
- Oracle 10g : org.hibernate.dialect.Oracle10gDialet
- Mysql : org.hibernate.dialect.MySQL5InnoDBDialect
- yml을 통한 설정
spring:
jpa:
properties:
hibernate:
dialect: org.hibernate.dialect.MySQL5InnoDBDialect
JPA를 통한 개발 구조
- 코드의 구조
- EntityManager 설정
- Transactioon 관리
- 비즈니스 로직
public class Main {
public static void main(String[] args) {
// EntityFactory 생성
Entitymanagerfactory emf = Persistence,createEntityManagerFactory("jpa");
// jpa 는 persistence.xml 파일에 등록된 DB연결 xml 정보의 이름
// EntityManager 생성
EntityManager em = emf.createEntityManager();
// Transaction 생성
EntityTransaction tx = em.getTransaction();
try {
tx.begin(); // 트랜젝션 시작 지점
businessLogic(); // 비즈니스 로직 실행
tx.commit(); // transaction commit
} catch(Exception e) {
tx.rollback(); // transaction 내에 코드 실패시 rollback
} finally {
em.close; // entity manager 종료
}
emf.close; // entity factory 종료
}
}
EntityManger와 EntityManagerFactory
- EntityManagerFactory 생성
- EntityFactory가 생성 되었을때 입력 받은 persistence.xml의 설정 정보를 사용해서 EntityManager 객체 생성
- EntityManager
- Entity를 DB에 등록/수정/삭제/조회를 할 수 있게 한다.
- Entity Manager는 DB connection과 관련이 있으므로 multi thread끼리 공유하면 안됩니다.
Trasaction 관리와 비즈니스 로직
- 트랜젝션 관리
- 트랜젝션 안에서 데이터 crud가 발생해야 한다.
- 트랜젝션 외에서 em를 사용하면 예외 발생
- 오류가 발생하지 않으면 commit을 호출
- 오류 발생 : rollback함수 호출
- 비즈니스 로직
- em을 통해서 CRUD 로직을 수행
public static void businessLogic() {
String id = "id1";
User user = new User(id);
user.setName("kkh");
user.setAge(26);
// 등록
user = em.persist(user);
// 수정
em.setAge(27);
// 한개의 User 조회
User findUser = em.find(User.class. id);
// User 목록 조회
List<User> users = em.createQuery("SELECT u FROM User u", User.class)
.getResultList();
// 삭제
em.remove(user);
}
- 수정시에는 setter 함수를 호출해서 entity 클래스의 필드 값을 변경하면 수정이 일어납니다.
- update함수는 없습니다.
JPQL
- 정의 : JPQL(Java Persistence Query Language)이라고 객체, 필드 중심의 SQL문을 의미한다.
- join과 같은 복잡한 SQL인 경우 사용
- JPQL은 table의 구조를 전혀 모른다
em.createQuery(JPQL, 반환 타입)
을 통해서 쿼리 객체 생성- getResultList() 메소드를 통해서실제 쿼리문과 결과 값을 반환
- 대소문자 구분하지 않음
반응형
'JPA > ORM 표준 JPA' 카테고리의 다른 글
06 연관관계 Mapping 종류 (2) | 2021.08.21 |
---|---|
05 연관관계 (0) | 2021.07.28 |
04 Entity (3) | 2021.07.08 |
03. 영속성 (0) | 2021.06.30 |
01. JPA 소개 (0) | 2021.05.19 |