@Entity
@Entity가 붙은 클래스는 JPA가 관리하는 클래스이다.
JPA를 사용해서 테이블과 매핑할 클래스는 @Entity가 필수이다.
데이터베이스의 테이블과 일대일로 매칭되는 객체단위이며 Entity 객체의 인스턴스 하나가 테이블에서 하나의 레코드 값을 의미합니다. 그래서 객체의 인스턴스를 구분하기 위한 유일한 키값을 가지는데 이것은 테이블 상의 Primary Key와 같은 의미를 가지며 @Id 어노테이션으로 표기합니다.
이때 명시적으로 @Table 의 name 속성을 이용해 데이터베이스상의 실제 테이블 명칭을 지정하지 않는다면 Entity클래스의 이름 그대로 CameCase를 유지한채 테이블이 생성되기 때문에 테이블 이름을 명시적으로 작성하는것이 관례입니다. 왜냐하면 데이터베이스상에서 보편적으로 사용되는 명명법은 UnderScore가 원칙이기 때문입니다.
주의점!!
기본 생성자 필수(파라미터가 없는 public 또는 protected 생성자).
final 클래스, enum, interface, inner 클래스 사용X.
저장할 필드에 final 사용 X.
@Column
@Column 어노테이션은 데이터베이스의 테이블에 있는 컬럼과 동일하게 1:1로 매칭되기 때문에 Entity클래스안에 내부변수로 정의 됩니다. 만약 테이블에 a,b,c 컬럼이 있다면 각각 3개의 @Column 어노테이션을 작성하게 됩니다.
이때 @Column 어노테이션은 별다른 옵션을 설정하지 않는다면 생략이 가능합니다. 즉 Entity 클래스에 정의된 모든 내부변수는 기본적으로 @Column 어노테이션을 포함한다고 볼 수 있습니다.
Spring Boot의 hibernate.hbm2ddl.auto 설정이 create 혹은 update로 되어 있을 경우 create일때는 최초 한번 컬럼이 생성되고 update일때는 Entity 클래스에 있지만 해당 테이블에 존재하지 않는 컬럼을 추가로 생성해줍니다. 하지만 컬럼의컬럼의 데이터 타입이 변경되었거나 길이가 변경 되었을때 자동으로 데이터베이스에 반영 해주지는 않기 때문에 속성이 변경되면 기존 테이블을 drop한 후 새롭게 create를 하던지 alter table 을 통해 직접 ddl문을 적용하는 것이 좋습니다.
@Column 도 @Entity 어노테이션과 동일하게 name 속성을 명시하지 않으면 Entity 클래스에 정의한 컬럼변수의 이름으로 생성됩니다. 그렇기 떄문에 CamelCase로 작성된 컬럼 변수가 있다면 UnderScrore 형식으로 name을 명시적으로 작성 합니다.
@Column(name = "username")
private String name;
@Column 어노테이션에 제약조건을 줄 수가있는데 예를들어 회원 이름은 필수, 10자 초과 X 라는 제약 조건을 주고 싶으면 아래와 같이 하면 되지만
@Column(unique = true, length = 10)
private String name;
name varchar(10) == 10자 초과 X
alter table member add constraint UK_xxxxx == 이미 Primarykey가 존재하므로 unique 값으로 들어감.
유니크 제약조건을 만들어 주긴 하지만 유니크 제약조건의 이름이 랜덤으로 생성되어서 가독성이 떨어집니다.
@Entity
@Table(uniqueConstraints = {@UniqueConstraint( name = "NAME_UNIQUE", columnNames = {"NAME"})})
public class Member {
@Id
private Long id;
@Column(length = 10)
private String name;
하지만 @Table 어노테이션에 위와 같이 설정하면
NAME_UNIQUE 같이 이름을 지정해 줄 수 있습니다.
이 외에도 columnDefinition등 여러가지가 있습니다.
@Enumerated
자바의 enum 타입을 매핑할 때 사용 하는 어노테이션입니다.
EnumType에는 EnumType.ORDINAL 과 EnumType.STRING 두 가지가 있습니다.
ORDINAL은 enum 순서를 데이터베이스에 저장합니다.
STIRNG은 enum 이름을 데이터베이스에 저장 됩니다.
예를들어 enum에 USER, ADMIN이 있으면 데이터베이스에는 0, 1이 저장 됩니다. 그런데 요구사항이 생겨서 GUEST가 추가 되어서
GUEST, USER, ADMIN 이 되면 GUSET는 0번이되고 USER는 1번은 ADMIN은 2번이 됩니다.
그래서 ORINAL을 쓰기보다는 STRING으로 사용하여 STRING 자체가 인서트 되도록 해야합니다.
@Temporal
날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용 참고: LocalDate, LocalDateTime을 사용할 때는 생략 가능(최신 하이버네이트 지원)
@Temporal(TemporalType.DATE) : 날짜 ,데이터베이스 date 타입과 매핑
ex) 2013-10-11
@Temporal(TemporalType.TIME) : 시간, 데이터베이스 time 타입과 매핑
ex) 11:11:11
@Temporal(TemporalType.TIMESTAMP) : 날짜와 시간, 데이터베이스 timestamp 타입과 매핑
ex) 2013-10-11 11:11:11
자바 8 이상,최신 하이버네이트는 LocalDate와 LocalDateTime을 지원해줍니다.
private LocalDate LocalDate;
private LocalDateTime localDateTime;
LocalDate : date
LocalDateTime : timestamp 로 생성 해줍니다.
@Transient
필드 매핑 X
데이터베이스에 저장X, 조회 X
주로 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때 사용.
@Transient
private Integet temp;
'JPA' 카테고리의 다른 글
[JPA] 단방향 연관관계 (0) | 2022.05.09 |
---|---|
[JPA]기본 키 매핑 (0) | 2022.05.08 |
[JPA] 데이터베이스 스키마 자동 생성 (0) | 2022.05.08 |
[Spring JPA] JPA란? (0) | 2022.05.08 |
[JPA] Maven JPA 설정 (0) | 2022.05.08 |
댓글