250x250
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- 이진탐색
- PS
- fetch
- querydsl
- 즉시로딩
- 낙관적락
- dfs
- 비관적락
- 다대일
- 연결리스트
- 연관관계
- 스프링 폼
- 유니크제약조건
- JPQL
- 데코레이터
- 동적sql
- eager
- 힙
- exclusive lock
- CHECK OPTION
- execute
- 지연로딩
- 백트래킹
- 스토어드 프로시저
- 다대다
- FetchType
- SQL프로그래밍
- 일대다
- BOJ
- shared lock
Archives
- Today
- Total
흰 스타렉스에서 내가 내리지
필드와 컬럼 매핑 : 레퍼런스 본문
728x90
# 매핑 어노테이션
- @Column
- @Enumerated
- @Temporal
- @Lob
- @Transient
- @Access
1. @Column
- 객체 필드를 테이블 컬럼에 매핑한다.
- 속성 중에 name, nullable, unique 가 주로 사용되고, 나머지는 잘 사용되지 않는 편이다.
- nullalbe 의 디폴트값은 true 이다.
@Column(nullable = false)
@Column(unique = true)
@Column(columnDefinition = "varchar(100) default 'EMPTY'")
@Column(length = 400)
- 생성된 DDL
- unique
- alter table Tablename add constraint UK_Xxx unique (username)
- columnDefinition
- data varchar(100) default 'EMPTY'
- unique
- length 는 String 에만 사용할 수 있다.
* 참고
int data1;
data1 integer non null // 생성된 DDL
Integer data2;
data2 integer // 생성된 DDL
@Column
int data3;
data3 integer // 생성된 DDL
- 자바 기본 타입은 null 값을 입력할 수 없다.
- JPA 는 DDL 생성 기능을 사용할 때, int data1 같은 기본 타입에는 not null 제약 조건을 추가한다.
- 반면에 Integer data2 처럼 객체타입이면 null 이 입력될 수 있으므로 not null 제약조건을 설정하지 않는다.
- 그런데 int data3 처럼 @Column 을 사용하면 @Column 은 nullable = true 가 기본값이므로 not null 제약조건을 설정하지 않는다.
- 따라서 자바 기본 타입에 @Column 을 사용하면 nullable = false 로 지정하는 것이 안전하다.
2. @Enumerated
@Enumerated(EnumType.STRING)
@Enumerated(EnumType.ORDINAL)
- EnumType.ORDINAL
- enum 에 정의된 순서대로 DB 에 저장
- EnumType.STRING
- enum 이름 그대로 ADMIN 은 'ADMIN'
* 주의
- 기본값인 ORDINAL 은 주의해서 사용해야 한다.
- ADMIN (0번), USER (1번) 사이에 enum 이 하나 추가되서 ADMIN (0번), NEW (1번), USER (2번)로 설정되면 이제부터 USER 는 2로 저장되지만 기존에 데이터베이스에 저장된 값은 여전히 1로 남아있다.
- 따라서 이런 문제가 발생하지 않는 EnumType.STRING 을 권장한다.
3. @Temporal
@Temporal(TemporalType.DATE)
private Date date;
@Temporal(TemporalType.TIME)
private Date date;
@Temporal(TemporalType.TIMESTAMP)
private Date timestamp;
//== 생성된 DDL ==//
date date,
time time,
timestamp timestamp,
- MySQL 은 timestamp 대신 datetime 을 쓴다.
4. @Lob
- 매핑하는 필드 타입이 문자면 CLOB 으로 매핑하고 나머지는 BLOB 으로 매핑한다.
- CLOB : String, char[], java.sql.CLOB
- BLOB : byte[], java.sql.BLOB
@Lob
private String lobString;
- description 필드처럼, 길이 제한이 없는 필드의 경우에 사용한다.
5. @Transient
- 이 필드는 매핑하지 않는다.
- 따라서 DB에 저장하지 않고 조회하지도 않는다.
- 객체에 임시로 어떤 값을 보관하고 싶을 때 사용한다.
6. @Access
- JPA 가 엔티티 데이터에 접근하는 방식을 지정한다.
- 필드 접근
- AccessType.FIELD 로 지정한다.
- 필드에 직접 접근한다.
- 필드 접근 권한이 private 이어도 접근할 수 있다.
- 프로퍼티 접근
- AccessType.PROPERTY 로 지정한다.
- 접근자(Getter) 를 사용한다.
- 필드 접근 방식과 프로퍼티 접근 방식을 함께 사용할 수도 있다.
@Entity
public class Member {
@Id
private String id;
@Transient
private String firstName;
@Transient
private String lastName;
@Access(AccessType.PROPERTY)
public String getFullName(){
return firstName + lastName;
}
public void setFullName(String fullName) {
// 예제 로직: fullName을 공백으로 나누어 firstName과 lastName을 설정합니다.
String[] parts = fullName.split(" ");
this.firstName = parts[0];
if (parts.length > 1) {
this.lastName = parts[1];
}
}
}
- @Id 가 필드에 있으므로 기본은 필드 접근 방식을 사용하고 getFullName() 만 프로퍼티 접근 방식을 사용한다.
- 따라서 Member 엔티티를 저장하면 member 테이블의 FULLNAME 컬럼에 firstName + lastName 의 결과가 저장된다.
'JPA' 카테고리의 다른 글
복합 키 : 비식별 관계 매핑 (1) | 2024.04.04 |
---|---|
식별 관계 vs 비식별 관계 (0) | 2024.04.04 |
@MappedSuperclass (1) | 2024.04.03 |
연관관계 편의 메소드 (0) | 2024.04.02 |
유니크 제약조건 - uniqueConstraints (0) | 2024.04.01 |