- JPA 는 특정 데이터베이스에 종속적이지 않음
- dialect interface 를 구현하는 MySQLDialect, OracleDialect H2Dialect 등이 존재
(dialect : SQL 표준을 지키지 않거나 특정 데이터베이스만의 고유한 기능(ROWNUM(ORACLE) vs LIMIT(Mysql)))
- h2 : 크기가 작은 메모리 DB, 테스트용으로 사용
[pom.xml (dependency)]
org.hibernate.hibernate-entitymanager dependency필요(해당 dependency가 jpa.persistence-api, hibernate-core 땡겨옴)
[persistence.xml]
jpa 설정을 위한 persistence.xml가 필요(spring fw기준)(boot는 yml 혹은 property에 작성)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version=“2.2">
<persistence-unit name="hello">
<properties>
<!-- 필수 속성 -->
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
<!-- 옵션 -->
<property name="hibernate.show_sql" value="true" />
<property name="hibernate.format_sql" value="true" />
<property name="hibernate.use_sql_comments" value="true" />
<property name="hibernate.id.new_generator_mappings" value="true" />
<!--<property name="hibernate.hbm2ddl.auto" value="create" />-->
</properties>
</persistence-unit>
</persistence>
|
cs |
* hibernate.hbm2ddl.auto (hibernate.ddl-auto) 옵션
create : 기존테이블 삭제 후 다시 생성
create-drop : create와 같으나 종료 시점에 테이블 drop
update : 변경분만 반영
validate : 엔티티와 테이블 정상 매핑인지만 확인
none : 사용하지않음
* 환경별 옵션 사용
개발 초기(create, update)
테스트서버 (update, validate)
운영서버 (validate, none)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@Entity
public class Member {
@Id
private Long id;
@Column(name = "USERNAME")
private String name;
private int age;
@Temporal(TemporalType.TIMESTAMP)
private Date regDate;
@Enumerated(EnumType.STRING)
private MemberType memberType;
}
|
cs |
@Entity (javax.persistence)
: JPA로 관리할 객체
@Id
: DB PK와 매핑 할 필드 ( * 보통 auto_increment 로 설계)
@Column
- name : 필드와 실제로 매핑할 테이블의 칼럼명(테이블 칼럼명이 필드와 다를 경우 사용)
- nullable : null허용
- unique : 유니크제약
- length 등..
@Temporal(TemporalType.DATE)
: 날짜타입매핑
@Enumerated
: 열거형 매핑
- EnumType.ORDINAL : 순서 저장(default)
- EnumType.STRING : 열거형 이름 그대로 저장 (ordinal 대신 string 사용할 것)
@Lob
: CLOB, BLOB 알아서 매핑
CLOB : char[]
BLOB : byte[]
@Transient
: DB에 저장하지 않는 Column(앱단에서만 사용)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
public static void main(String args[]) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello"); //factory는 하나만 생성하여 애플리케이션 전체에서 공유
EntityManager em = emf.createEntityManager(); //요청마다 manager 생성하여 사용
EntityTransaction tx = em.getTransaction(); //transcation
tx.begin();
try {
Member member = new Member();
member.setId(1L);
member.setName("hello");
em.persist(member);
tx.commit();
} catch (Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
|
cs |
'back > JPA' 카테고리의 다른 글
[JPA] equals , hashcode (0) | 2022.11.08 |
---|---|
[JPA] JPQL, QueryDSL (0) | 2020.03.21 |
[JPA] JPA 영속성 컨텍스트 (0) | 2020.03.08 |
[JPA] 연관관계 매핑 : 단방향, 양방향 매핑 (0) | 2020.03.01 |
[JPA] JPA란? : 등장배경, ORM, 하이버네이트 (0) | 2020.02.23 |