Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 29 | 30 | 31 |
Tags
- 람다
- 후기
- 카카오톡1차
- 오라클
- javascript
- 독서
- Eclipse
- 인프런
- 에러
- 공부
- Design Pattern
- 이펙티브자바
- 디자인패턴
- Java
- Oracle
- 인강리뷰
- 독서리뷰
- 자바
- math
- JPA
- 회고
- 매핑
- spring
- 프로그래머스
- study
- 우아한테크코스
- 인코딩
- Singleton
- Head First Design Pattern
- 알고리즘
Archives
- Today
- Total
Lee's Grow up
[JAVA/JPA] Entity Mapping 방법 본문
반응형
해당 내용은 인프런의 자바 ORM 표준 JPA 프로그래밍 - 기본편, 김영한
의 내용을 기반으로 정리해서 작성한 글입니다.
자세한 내용은 해당 강의 또는 책을 구매하셔서 알아보시는걸 추천합니다.
사용 어노테이션
- 객체와 테이블 매핑 : @Entity , @Table
- 필드와 컬럼 매핑 : @Column, @Enumerated, @Temporal, @Lob, @Treansient
- 기본 키 패킹 : @Id
- 연관관계 매핑 : @ManyToOne, @JoinColumn
객체와 테이블 매핑
@Entity
정의 : JPA가 관리하는 객체라고 선언하는 어노테이션
- 기본 생성자 (
public
,protected
) 가 필수로 있어야 ( 리플렉션이나 여러 기술을 사용할 때 필요 ) - final, enum, interface, inner 클래스는 사용 불가능
- 필드에도 final 키워드 사용 불가능
속성
name
라는 속성이 사용가능하며. Default로 클래스 이름으로 지정, 다른 패키지내 같은 클래스이름이 있을 경우 둘을 구분하기 위해 사용한다.
import javax.persistence.Entity;
@Entity( name = "Member" )
public class Member {
public Member() { }
}
@Table
정의 : Entity
와 매핑될 DB 테이블에 대한 설정
속성
속성 | 기능 | 기본값 |
name | 매핑할 테이블 이름 | Entity 의 name |
catalog | 데이터베이스 catalog 매핑 | |
schema | 데이터베이스 schema 매핑 | |
uniqueConstraints(DDL) | DDL 생성 시에 유니크 제약 조건 생성 |
필드와 컬럼 매핑
어노테이션 | 설명 |
@Column | 컬럼과 매핑 |
@Temporal | 날짜 타입 컬럼과 매핑 |
@Enumerated | enum 타입과 컬럼 매핑 |
@Lob | BLOB, CLOB 매핑 |
@Transient | 필드와 컬럼 매핑 제외 |
@Column
속성
name
: 테이블에 매칭시킬 컬럼 이름 ( default : 필드명 )insertable
,updateable
: 등록, 변경 여부 ( default : true )nullable
: null 값의 허용 여부, false로 설정시 DDL 생성 시에 not null 제약 조건이 자동 생성unique
: @Table의 unique 속성과 같지만 컬럼에도 선언 가능- 단 실무에서는 Unique 제약조건명이 자동으로 생성되기 때문에 사용을 안함
columnDefinition
: 데이터베이스에 컬럼 정보를 직접 생성length
: 문자 컬럼의 길이 제약조건, String 타입에서만 사용가능 (default : 255 )precision
,scale
: BigDecimal 타입이나 BigInteger에서 사용, double, float불가, 큰숫자나 정밀한 소수점 계산시 사용- percision : 소수점을 포함한 전체 자릿수
- scale : 소수의 자릿수
public class Member {
@Column( name ="MEM_NAME", insertable = true, nullable = false
,columnDefinition = "varchar2(200) default 'NONE'", length = 255)
private String name;
@Column(percision = 19 )
private BigDecimal age;
}
@Enumerated
- Enum 타입을 매핑할 때 사용 속성으로는
ORDINAL
과STRING
를 사용하지만,STRING
만 사용할 것 enum 순서에 변화가 생겼을 때, 순서로 저장할 경우 데이터 불일치 발생- ORDINAL : enum 순서를 저장
- STRING : enum 이름을 저장
@Temporal
정의 : 날짜 타입 Date, Calendar 을 매핑, LocalDate, LocalDateTime을 사용할 경우 생략 가능
속성
TemporalType.DATE
: 날짜, DB의 date 타입과 매핑TemporalType.TIME
: 시간, DB의 time 타입과 매핑TemporalType.TIMESTAMP
: 날짜와 시간, DB의 timestamp와 매핑
public class Member {
@Temporal(TemporalType.TIMESTAMP)
private Date;
private LocalDate localDate;
pirvate LocalDateTime localDateTime;
}
@Lob
- DB의 BLOB, CLOB 와 매핑, 지정할 수 있는 속성이 없으며 문자타입이면 CLOB, 나머지는 BLOB로 자동 매핑
@Transient
- 필드에서 매핑시 제외시키고 싶은 필드에 선언, 메모라상에서만 쓰고 싶은 경우
기본키 매핑
해당 필드를 DB에 사용할 기본키로 선언시 사용, 직접 할당시 @Id
만 선언해주면 되지만, 보통 sequence나 autoincrement 등으로 자동 관리하는 경우가 많은데 그럴 경우 @GeneratedValue
를 같이 사용해줘야 한다.
@GeneratedValue의 속성
- IDENTITY : DB에 위임, autoincrement ( mySQL )
- SEQUECNE : 데이터베이스 시퀀스 sequence 사용 , ORACLE , 추가로 @SequenceGenerator 필요public class Member {}
@Id @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MEMBER_SEQ_GENERATOR") private Long id; // 값을 주면 안된다.
@Entity @SequenceGenerator( name = "MEMBER_SEQ_GENERATOR" // sequenceGenerator 이름 지정 squenceName = "MEMBER_SEQ" // 매핑할 시퀀스 이름 initialValue = 1, allocationSize = 1 ) // 시작하는 숫자, 증가값 기본으로 50
- TABLE : 키 테이블 사용, 모든 DB에서 사용 가능하지만, 성능 이슈 발생
- AUTO : 방언에 따라 자동 지정, 기본 값
기본키 전략 strategy 의 특징
- IDENTITY 전략의 특징
- 키값이 자동으로 생성되기 때문에 영속성 컨텍스트는 해당 Entity의 키값을 모른다. ( 영속컨테이너 메커니즘에 의해 ) 그렇기 때문에
commit()
나flush()
시점이아닌,persist()
시점에 insert가 발생하고 return 으로 키 값을 받아오기 때문에 별도의 select문은 없음, ( JDBC를 이용 )
- 키값이 자동으로 생성되기 때문에 영속성 컨텍스트는 해당 Entity의 키값을 모른다. ( 영속컨테이너 메커니즘에 의해 ) 그렇기 때문에
- SEQUENCE 전략의 특징
IDENTITY
전략과 마찬가지로 DB에 들어가야 키 값을 알 수 있음, 마찬가지로persist()
시점에 동작하며.SEQUENCE.nextVal()
호출로 키 값을 가져오며, insert는 기존의 메커니즘과 같이commit()
,flush()
에 동작, 그래서allocationSize
가 default로 50으로 잡혀 있는것!, 불필요하게 DB에 접근해서 sequence값을 가져오지 않고, 버퍼 기능도 사용가능하고, 동시성도 제어 가능
데이터베이스 스키마 자동 생성
객체를 Entity로 매핑을 설정해놓으면 컴파일 단계에서 자동으로 DB에 테이블 생성 ( DDL ) 문을 동작, 개발 환경에서만 사용할 것을 권장
옵션 | 설명 |
create | 기존테이블 삭제 후 다시 생성 |
create-drop | create와 같고 종료 시점에 drop |
update | 변경된 부분만 반영 |
validate | 엔티티와 테이블 정상 매핑 확인 |
none | 사용 x |
반응형
'PROGRAMMING > JAVA' 카테고리의 다른 글
[JAVA/JPA] 상속관계 매핑 (0) | 2020.04.13 |
---|---|
[JAVA/JPA] 연관관계 매핑 (0) | 2019.12.09 |
[JAVA/JPA] 영속성 컨텍스트 EntityManage JPA 동작 방식 (0) | 2019.12.07 |
[JAVA/JPA] JPA 와 ORM 기본 개념 Hibernate ORM (0) | 2019.12.05 |
[EFFECTIVE JAVA 3/E] 객체 생성자 파괴 (0) | 2019.11.04 |
Comments