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

 

 

 

1. 객체와 테이블 매핑 (@Entity, @Table)

 

1-1. @Entity

: @Entity 가 붙은 클래스는 JPA가 관리하는 객체이다. 붙지않으면 JPA와 관련없는 클래스

: 엔티티가 매핑된 것들을 자동으로 테이블을 만들어낸다. 

@Entity
public class Member {
	@Id
	private Long id;
	private String name;
	private int age;
}

테이블 자동생

 

 

  • 주의할 점

- 기본 생성자 필수 (파라미터가 없는 public, protected 생성자)

- 저장할 필드에 final 사용하면 됨

 

  • 속성 : name (잘 쓰진 않음)
@Entity(name = "Member")
public class Member {
}

 

 

 

1-2. @Table

: 엔티티와 매핑할 테이블 지정

 

  • 속성

name : 테이블명을 지정하고 싶을때 

@Entity
@Table(name = "MBR")
public class Member {
}

 

 

 

 

 

2. 필드와 컬럼 매핑 : @Column

@Entity
public class Member {
	@Id
	private Long id;
    
	@Column(name="USERNAME", unique=true, length=10)
	private String name;
    
	private Integer age; //DB에도 숫자타입
    
	//객체에서 enum 타입을 쓸때
	@Enumerated(EnumType.STRING)
	private RoleType roleType;
    
	@Temporal(TemporalType.TIMESTAMP)
	private Date lastModifiedDate;
    
	//varchar 보다 큰 크기
	@Lob
	private String description; // @Lob + 문자열이면 'clob' 이름으로 매핑이 됨
}

 

  • 속성
    • name="USERNAME" : DB의 데이터 컬럼명을 바꾸고싶을 때 
    • unique=true : 유니크 제약조건. DDL 생성, (DB에만 영향을 주고 JPA 실행 로직에는 영향 X)
      • @Column 안에서 잘 쓰지않고 클래스에서 @Table(uniqueConstraints="") 이 방식을 더 선호 
    • length=10 : 문자 길이 제약조건
    • nullable = true/false : null 값 허용 여부
    • insertable , updatable : 등록, 변경 가능여부 
      • ex) updatable=false 하면 업데이트를 해도 DB에 반영되지 않음
    • precision , sacle : 아주 큰 숫자나 소수점 쓸 때 

 

 

 

enum 타입
@Enumerated

객체에서 enum 타입을 쓴다면 DB에는 enum 타입이 없기때문에 @Enumerated 어노테이션을 쓴다.

public enum RoleType {
	USER, ADMIN
}
@Enumerated(EnumType.STRING)
private RoleType roleType;

 

  • 주의사항

기본이 ORDINAL 인데 사용하지 않는다 

> EnumType.ORDINAL : enum 순서를 DB에 저장 (숫자 타입으로 DB에 저장이 된다.  0,1,2,3...)

현재 enum 타입을 쓰는 객체 USER, ADMIN 은 각 0번, 1번 순서

 

쓰면 안되는 이유 

enum 타입을 쓰는 객체 GUEST를 추가했을때 GUEST도 0번째가 되어버려서 

USER도 0번 순서, GUEST도 0번 순서로 겹쳐버리기 때문에 필수로 EnumType.STRING 를 사용한다.

public enum RoleType {
	GUEST, USER, ADMIN
}

 

 

그렇기 때문에 문자타입인 EnumType.STRING을 쓴다면 GUEST, USER, ADMIN 구분이 쉽게 된다.

 

 

 

날짜 타입
@Temporal
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
  • DATE : 날짜
  • TIME : 시간
  • TIMESTAMP : 날짜,시간

 

* DB와 관련없이 메모리에만 객체를 쓰고싶다 > @Transient 

* 최신버전은 LocalDate createDate : 년월 / LocalDateTime : 년월시간

 

 

 

 

 

 

 

 

 

 

기본키 매핑은 다음 글...

반응형
LIST

+ Recent posts