엔티티매핑
엔티티에 대하여 자세히 알아보자
JPA에서 자주 사용하는 것으로 XML로 작성이 가능하지만 어노테이션이 사용하기 편리하며 다음과 같이 존재한다.
객체와 테이블을 매핑 : @Entity, @Table
기본 키 매핑 : @Id
필드와 컬럼 매핑 : @Column
연관관계 매핑 : @ManyToOne, @JoinColumn
@Entity
가장 기본이 되는 어노테이션으로 RDB의 테이블과 Java 객체를 매핑해준다.
속성명 | 설명 |
---|---|
name | JPA에서 사용할 엔티티 이름을 지정한다.</br>보통 기본값인 클래스 이름을 사용한다.</br> 만약 다른 패키지 이름이 같은 엔티티 클래스가 있다면 오류가 발생한다. |
주의 사항
- 기본 생성자가 필요하다. Java 에서는 생성를 작성하지 않으면, 기본 생성자가 있는 것으로 간주하지만, 생성자를 따로 만든다면, 기본 생성자를 생성해주어야 한다.(파라미터가 없는 public 또는 protected 생성자)
- final, enum, interface, inner class에는 사용이 불가능하다.
- 저장할 필드에 final 사용불가 (당연하게도 사용이 불가능)
@Table
기본적으로 엔티티명과 같은 테이블과 객체를 매핑하지만, 특정 테이블과 매핑하고 싶은 때 이용한다. 예를 들어 회사에서 특정 prefix를 반드시 테이블에 붙여야 한다면, 이러한 기능은 유용하게 쓰일 수 있다.
속성명 | 설명 |
---|---|
name | 매핑할 테이블 명 (default. 엔티티 이름 사용) |
Catalog | catalog 기능이 있는 DB에서 catalog 를 매핑 (default. DB 명) |
Schema | schema 기능이 있는 DB에서 schema를 매핑 |
uniqueConstraints | DDL 생성 시 유니크 제약조건을 만듦 |
데이터베이스 스키마 자동 생성 (쓰지 말자)
이 기능은 여러 문제를 발생 시킬 수 있다. 의도적으로 작성하지 않은 내용이니, 알고 싶다면 구글에 검색해보자.
@Id
- RDB에 고유값(PK)값이 되는 값임을 알려준다.
- 고유값이기 때문에 영속성 컨텍스트가 관리하는 객체는 무조건 이 값이 존재한다.
- 아래의 생성전략을 정해주지 않으면, 오류가 난다. 때문에 직접 값을 할당해 주던지, 아니면 생성전략을 선택해야한다.
- Id는 기본유형과 다음의 참조유형을 사용한다. (java.lang.String, java.util.Date, java.sql.Date, java.math.BigDecimal, java.math.BigInteger)
@GeneratedValue
속성명 | 설명 |
---|---|
IDENTITY | 기본 키 생성을 데이터베이스에 위임 (= AUTO_INCREMENT) |
SEQUENCE | 데이터베이스 시퀀스를 사용해서 기본 키를 할당, 데이터베이스 시퀀스에서 식별자 값을 획득한 후 영속성 컨텍스트에 저장(오라클, PostgreSQL, DB2, H2) |
TABLE | 키 생성 테이블을 사용, 테이블을 사용하므로 모든 데이터베이스에 적용 가능 |
AUTO | 선택한 데이터베이스 방언에 따라 방식을 자동으로 선택(Default) |
아래 속성 필요
1
<property name="hibernate.id.new_generator_mappings" value="true">
@Column
객제 속성을 RDB의 컬럼과 매핑 할 수 있다.
속성명 | 설명 |
---|---|
name | 필드와 매핑할 테이블 컬럼 이름 (default. 객체의 필드 이름) |
insertable | |
updatable | |
unique | |
nullable (DDL) | null 값의 허용 여부 설정, false 설정 시 not null (default. true) |
unique (DDL) | @Table 의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 적용 |
columnDefinition (DDL) | 데이터베이스 컬럼 정보를 직접 줄 수 있음, default 값 설정 (default. 필드의 자바 타입과 방언 정보를 사용해 적절한 컬럼 타입을 생성) |
length (DDL) | 문자 길이 제약조건, String 타입에만 사용 (default. 255) |
percision, scale (DDL) | BigDecimal, BigInteger 타입에서 사용. 아주 큰 숫자나 정밀한 소수를 다룰 때만 사용 (default. precision = 19, scale = 2) |
@Enumerated
enum 타입을 매핑할 때 사용 |속성명|설명| |:–|:–| |value| EnumType.ORDINAL : enum 순서를 데이터베이스에 저장 쓰면 안된다. 나중에 순서가 뒤 바뀌면 엉망이 될 수 있다.</br> EnumType.STRING : enum 이름을 데이터베이스에 저장 (default. EnumType.ORDINAL) |
@Temporal
날짜 타입 (java.util.Date, java.util.Calendar)을 매핑할 때 사용
속성명 | 설명 |
---|---|
value | TemporalType.DATE : 날짜, 데이터베이스 data 타입과 매핑 (2020-12-18)</br> TemporalType.TIME : 시간, 데이터베이스 time 타입과 매핑 (23:36:33) </br> TemporalType.TIMESTAMP : 날짜와 시간, 데이터베이스 timestamp 타입과 매핑 (2020-12-18 23:36:33) (default. TemporalType은 필수로 지정) |
@Temporal 을 생략하면 자바의 Date와 가장 유사한 timestamp로 정의
@Lob
데이터베이스 BLOB, CLOB 타입과 매핑 매핑하는 필드 타입이 문자면 CLOB로 나머지는 BLOB로 매핑
@Transient
이 필드는 매핑하지 않으며, 데이터베이스에 저장하지 않고 조회불가 하다. 객체에 임시로 어떤 값을 보관하고 싶을 때 사용한다.
@Access
JPA가 엔티티 데이터에 접근하는 방식을 지정
|속성명|설명| |:–|:–|
value | 필드 접근 : AccessType.FIELD 로 지정, 필드에 직접 접근 (private도 접근 가능) </br> 프로퍼티 접근: AccessType.PROPERTY 로 지정, 접근자 Getter를 사용 |
Comments powered by Disqus.