엔티티와 테이블을 정확하게 매핑하는것은 JPA에서 중요한 요소입니다.
따라서 다양한 어노테이션을 알아두어야 합니다.
대표적 어노테이션
- 객체와 테이블 매핑 : '@Entity,@Table'
- 기본키 매핑 : '@Id'
- 필드와 컬럼 매핑 : '@Column'
- 연관 관계 매핑 : '@ManyToOne,@JoinColumn'
테이블을 엔티티(객체)로 매핑한 예
테이블의 특성 | 관계형 DB특성 |
---|---|
JAVA Class를 통해 관계형 DB가 가진 요소인 엔티티,속성,기본키,연관관계등을
매핑할수가 있습니다. 각 인스턴스 튜플요소의 집합요소는 Repository객체의 검색조건에의해
ListType형태로 사용이 가능합니다.
Entity를 사용하여 Class객체와 매핑된 테이블 객체는, 어플리케이션 내에서도
User Class(객체)라고 표현하지 않고, User Entity라고 표현합니다. ( DB와 OOP의 일치)
@Entity(name="User") @Table(name="tbl_user") @Access(AccessType.PROPERTY) public class User { //사용자라는 관계형DB가 표현하는 엔티티를 클래스를 통해 정의합니다. @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "USER_ID") private Long id; // DataType과 이름을 정의하는 속성(필드,멤버)입니다. private String name; private String email; @Column(columnDefinition="char(7)") private String itemtype; @ManyToOne //ERD의 연관도 관계를 표현할수 있습니다. @JoinColumn(name = "GROUP_ID") private GroupInfo groupInfo; //getter,setter 생략
Entity
속성 | 기능 | 기본값 |
---|---|---|
name | JPA에서 해당 엔티티에 접근할때 사용되는 이름으로 지정이가능합니다. | 지정을 하지 않을시 Class 이름 ( ex>User) 을 그대로 사용 |
- 어노테이션 생략불가
Table
속성 | 기능 | 기본값 |
---|---|---|
name | 실제 매핑할 테이블명 | 엔티티의 이름 (네임룰적용가능) |
catalog | catalog기능이 있는 데이터베이스에서 관련기능 매핑 | |
schema | schema기능이 있는 데이터베이스에서 관련기능 매핑 | |
uniqueConstraints | DDL 생성시 유니크 제약조건을 만듬 |
- 어노테이션 생략가능
Column
속성 | 기능 | 기본값 |
---|---|---|
name | 매핑할 필드명 지정이 가능합니다. | 지정없을시 멤버이름 그대로사용 |
nullable | null 제약조건 지정가능 | true |
unique | 한컬럼에 유니크 제약을 걸때 | false |
columnDefinition | 데이터 베이스의 컬럼정보를 지정 | |
length | 문자 길이 제약조건 String사용가능 | 255 |
precision,scale | 아주큰 숫자,정밀도가 높은 소수점을 사용시 | precision=19, scale=2 |
- 어노테이션 생략 가능
- 자바 기본타잎에는 null이 허용되지 않는다. 그래서 이곳에 null이 셋팅되려고하면 예외가 발생한다.
- 만약, 데이터가(int) 이미 null허용정책이라고 한다면, Interger를 사용해야한다.
- 해당 컬럼 Json노출(주로 보안용)을 방지하고자 한다면 '@JsonIgnore' 을 필드에 설정가능
특수 어노테이션
이름 | 기능 | 사용예 |
---|---|---|
Transient | 데이터베이스에 저장/조회에 관여하지 않고 매핑에 제외 | @Transient |
Access | 엔티티에 접근하는방식 지정 | @Access(AccessType.FIELD) 멤버를 통해서 접근가능 @Access(AccessType.PROPERTY) 프로퍼티(세터,게터)를 통해 접근 |
Lob | 데이터 베이스 BLOB, CLOB 타잎과 매핑 |