JPA

JPA시작(7)_필드와 컬럼 매핑_속성에 따른 DDL 생성확인 @Column, @Enumerated, @Temporal, @Lob, @Transient, @Access

개발자 배찌 2021. 6. 7. 16:56
728x90

@Column

객체필드를 테이블 컬럼에 매핑한다.

 

▼ nullable (DDL 생성기능)

@Column (nullable = false)
private String data;

//생성된 DDL
data varchar(255) not null

▼ unique (DDL 생성기능)

@Column (unique = true)
private String username;

//생성된 DDL
alter table Tablename add Constraint UK_Xxx unique (username)

▼ columnDefinition (DDL 생성기능)

@Column (columnDefinition = "varchar(100) default 'EMPTY'")
private String data;

//생성된 DDL
data varchar(100) default 'empty'

▼precision, scale (DDL 생성기능)

@Column (precision = 10, scale = 2)
private BigDecimal cal;

//생성된 DDL
cal numeric(10,2) //h2, PostgreSQL
cal number(10,2) //오라클
cal decimal(10,2) //Mysql

 

 

@Enumerated

@Enumerated 를 사용하면 편리하게 enum 타입을 데이터베이스에 저장할 수 있다.

 

enum 타입의 클래스.. RoleType.java

enum RoleType {
    ADMIN, USER
}

 

enum 이름으로 매핑하기

@Enumerated(EnumType.STRING)
private ROLETYPE roleType;

 

enum은 다음처럼 사용한다.

member.setRoleType(RoleType.ADMIN);  //DB에 문자 ADMIN으로 저장된다

 

@Temporal

날짜 타입( java.util.Date, java.util.Calendar) 를 매핑할 때 사용

 

▼ Temporal 사용 예시

@Temporal (TemporalType.DATE)
private Date date;  //날짜

@Temporal (TemporalType.TIME)
private Date time; //시간

@Temporal (TemporalType.TIMESTAMP)
private Date timestamp;  //날짜와 시간


//생성된 DDL
date date,
time time,
timestamp timestamp,

@Temporal 을 생략하면 자바의 Date와 가장 유사한 timestamp로 정의됨.

 

 

@Lob

매핑하는 필드 타입이 문자면 CLOB으로 매핑하고, 나머지는 BLOB으로 매핑한다

  • CLOB : String, char[], java.sql.CLOB
  • BLOB : byte[], java.sql.BLOB

 

▼ Lob 사용 예시

@Lob
private String lobString;

@Lob
private byte[] lobByte;

//생성된 DDL

//오라클
lobString clob,
lobByte blob,

//Mysql
lobString longtext,
lobByte longblob;

 

 

@Transient 

이 필드는 매핑하지 않는다. 데이터베이스에 저장하지않고 조회하지도 않는다.

객체에 임시로 어떤 값을 보관하고 싶을 때 사용

@Transient
private Integer temp;

 

@Access

jpa가 엔티티 데이터에 접근하는 방식을 지정

  • 필드접근
  • 프로퍼티 접근

▼ 필드접근코드

@Entity
@Access(AccessType.FIELD)
public class Member {
    @Id
    private String id;
    .....
}

@Access 를 설정하지 않으면 @Id 위치를 기준으로 접근방식이 설정된다

@Id가 필드에 있으므로 필드접근방식임.. @Access(AccessType.FIELD) 생략가능

 

▼ 프로퍼티 접근코드

@Entity
@Access(AccessType.PROPERTY)
public class Member {
    private String id;
    .....

    @Id
    public String getId(){
          return id; 
    }
    ......
}

@Access 를 설정하지 않으면 @Id 위치를 기준으로 접근방식이 설정된다

@Id가 프로퍼티에 있으므로 프로퍼티 접근방식임.. @Access(AccessType.PROPERTY) 생략가능

 

▼ 필드 / 프로퍼티 접근 함께사용

@Entity
public class Member {
  @Id
    private String id;
    .....

   public String getId(){
          return id; 
    }

   @Access(AccessType.PROPERTY)
   public String getFullName(){
         return firstName + lasName;
   }
    ......
}

@Id가 필드에 있으므로 필드접근방식임..

getFullName()만 프로퍼티 접근방식을 사용