일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- gitinitial
- springbootH2
- javageneric
- 에이치투데이터베이스
- 임베디드타입
- spring
- JPA Hint & Lock
- JPA프록시
- Open EntityManager
- 스프링부트
- JDBC connection pool
- MySqlType
- 이해와 원리
- JPA값타입
- sql
- 스프링부트기본설정
- 데이터베이트h2
- OSIV
- Git
- dockercmd
- jpqlquery
- 자바제너릭
- JPAproxy
- JPAmapping
- 제이피큐엘쿼리
- jpa
- springbootproxy
- springboot기본설정
- embededtype
- httppie
- Today
- Total
빡코
[JPA][개념] 엔티티 매핑 본문
*DDL(Data Definition Language) : 데이터 정의어란? 데이터베이스를 정의하는 언어이며, 데이터를 생성, 수정, 삭제하는 등의 데이터의 전체의 골격을 결정하는 역할을 하는 언어(Creat, Drop, alter, truncate)
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
<persistence-unit name="hello">
<properties>
<!--<property name="hibernate.hbm2ddl.auto" value="create" />-->/
</properties>
</persistence-unit>
</persistence>
필드와 칼럼매핑
기본 키 매핑 어노테이션
•직접할당: @Id만사용
•자동생성(@GeneratedValue)
•IDENTITY: 데이터베이스에 위임, MYSQL
•SEQUENCE: 데이터베이스시퀀스오브젝트 사용, ORACLE
•@SequenceGenerator 필요
•TABLE: 키생성용 테이블사용, 모든 DB에서 사용
•@TableGenerator 필요
•AUTO: 방언에 따라 자동지정, 기본값
IDENTITY 전략 - 특징
•기본키 생성을 데이터베이스에 위임
•주로 MySQL, PostgreSQL, SQL Server, DB2에서 사용(예: MySQL의 AUTO_ INCREMENT)
•JPA는 보통트랜잭션커밋 시점에 INSERT SQL 실행
•AUTO_ INCREMENT는 데이터베이스에 INSERT SQL을 실행한 이후에 ID 값을 알 수 있음
•IDENTITY 전략은 em.persist() 시점에 즉시 INSERT SQL 실행하고 DB에서 식별자를 조회
@Entity
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Column(name = "name", nullable = false)
private String username;
}
//Main Class
public class JpaMain {
public static void main(String[] args) {
//데이터베이스 하나당 하나씩 묶여서 돌아감
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
//고객의 요청이 올때 EntityManager 생성해서 실행
EntityManager em = emf.createEntityManager();
//Transaction 안에서 진행되어야 한다.
EntityTransaction tx = em.getTransaction();
tx.begin(); //Transaction 시작
try {
//영속
Member member = new Member();
member.setUsername("chris-2");
em.persist(member);
tx.commit();//inset query가 나가는 시점
} catch ( Exception e) {
tx.rollback();
} finally {
em.close();
}
emf.close();
}
}
//로그
Hibernate:
/* insert hellojpa.Member
*/ insert
into
Member
(id, name)
values
(null, ?)
member Id = 1 chris-2
*em.persist(member); 시점에 insert 진행됨
SEQUENCE 전략 - 특징
•데이터베이스시퀀스는 유일한 값을 순서대 로생성하는 특별한 데이터베이스오브젝트(예: 오라클시퀀스)
•오라클, PostgreSQL, DB2, H2 데이터베이스에서 사용
@Entity
@SequenceGenerator(
name = "MEMBER_SEQ_GENERATOR",
sequenceName = "MEMBER_SEQ",
initialValue = 1, allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE,
generator = "MEMBER_SEQ_GENERATOR"
)
private Long id;
@Column(name = "name")
private String username;
}
drop sequence if exists MEMBER_SEQ
Hibernate: create sequence MEMBER_SEQ start with 1 increment by 1
Hibernate:
create table Member (
id bigint not null,
name varchar(255),
primary key (id)
)
신규 멤버 생성시 MEMBER_SEQ 호출하는 것을 볼 수 있음
INFO: HHH000400: Using dialect: org.hibernate.dialect.H2Dialect
Hibernate:
call next value for MEMBER_SEQ //em.persist 전에 DB에서 값을 먼저 얻어오고 cmmit 시점에 저장한다.
Hibernate:
/* insert hellojpa.Member
*/ insert
into
Member
(name, id)
values
(?, ?)
**allocationSize: DB에 숫자만큼 먼저 올려놓고 메모리에 가져와서 하나씩 사용한다.
Table 전략
@Entity
@TableGenerator(
name = "MEMBER_SEQ_GENERATOR",
table = "MY_SEQUENCES",
pkColumnValue = "MEMBER_SEQ", allocationSize = 1)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.TABLE,
generator = "MEMBER_SEQ_GENERATOR"
)
private Long id;
@Column(name = "name")
private String username;
}
Hibernate:
drop table Member if exists
Hibernate:
drop table MY_SEQUENCES if exists
Hibernate:
create table Member (
id bigint not null,
name varchar(255),
primary key (id)
)
Hibernate:
create table MY_SEQUENCES (
sequence_name varchar(255) not null,
next_val bigint,
primary key (sequence_name)
)
Hibernate:
insert into MY_SEQUENCES(sequence_name, next_val) values ('MEMBER_SEQ',0)
Hibernate:
select
tbl.next_val
from
MY_SEQUENCES tbl
where
tbl.sequence_name=? for update
Hibernate:
update
MY_SEQUENCES
set
next_val=?
where
next_val=?
and sequence_name=?
Hibernate:
/* insert hellojpa.Member
*/ insert
into
Member
(name, id)
values
(?, ?)
'Java > JPA' 카테고리의 다른 글
[JPA][개념] 프록시와 연관관계 정리 (0) | 2023.03.23 |
---|---|
[JPA][개념] 상속관계 (0) | 2023.02.22 |
[JPA][개념]다양한 연관관계 매핑 (0) | 2023.02.17 |
[JPA][개념] 영속성 관리 (0) | 2023.02.10 |
[JPA][기본개념] 정리 (0) | 2023.02.06 |