Home 자바 ORM 표준 JPA 프로그래밍(희망편03)
Post
Cancel

자바 ORM 표준 JPA 프로그래밍(희망편03)

엔티티매핑

엔티티에 대하여 자세히 알아보자

JPA에서 자주 사용하는 것으로 XML로 작성이 가능하지만 어노테이션이 사용하기 편리하며 다음과 같이 존재한다.

객체와 테이블을 매핑 : @Entity, @Table
기본 키 매핑 : @Id
필드와 컬럼 매핑 : @Column
연관관계 매핑 : @ManyToOne, @JoinColumn

@Entity

가장 기본이 되는 어노테이션으로 RDB의 테이블과 Java 객체를 매핑해준다.

속성명설명
nameJPA에서 사용할 엔티티 이름을 지정한다.</br>보통 기본값인 클래스 이름을 사용한다.</br> 만약 다른 패키지 이름이 같은 엔티티 클래스가 있다면 오류가 발생한다.

주의 사항

  • 기본 생성자가 필요하다. Java 에서는 생성를 작성하지 않으면, 기본 생성자가 있는 것으로 간주하지만, 생성자를 따로 만든다면, 기본 생성자를 생성해주어야 한다.(파라미터가 없는 public 또는 protected 생성자)
  • final, enum, interface, inner class에는 사용이 불가능하다.
  • 저장할 필드에 final 사용불가 (당연하게도 사용이 불가능)

@Table

기본적으로 엔티티명과 같은 테이블과 객체를 매핑하지만, 특정 테이블과 매핑하고 싶은 때 이용한다. 예를 들어 회사에서 특정 prefix를 반드시 테이블에 붙여야 한다면, 이러한 기능은 유용하게 쓰일 수 있다.

속성명설명
name매핑할 테이블 명 (default. 엔티티 이름 사용)
Catalogcatalog 기능이 있는 DB에서 catalog 를 매핑 (default. DB 명)
Schemaschema 기능이 있는 DB에서 schema를 매핑
uniqueConstraintsDDL 생성 시 유니크 제약조건을 만듦

데이터베이스 스키마 자동 생성 (쓰지 말자)

이 기능은 여러 문제를 발생 시킬 수 있다. 의도적으로 작성하지 않은 내용이니, 알고 싶다면 구글에 검색해보자.

@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)을 매핑할 때 사용

속성명설명
valueTemporalType.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를 사용
This post is licensed under CC BY 4.0 by the author.

자바 ORM 표준 JPA 프로그래밍(희망편02)

자바 ORM 표준 JPA 프로그래밍(희망편04)

Comments powered by Disqus.

Trending Tags