티스토리 뷰
요구사항 추가
- 회원은 일반 회원과 관리자로 구분해야한다.
- 회원 가입일과 수정일이 있어야 한다.
- 회원을 설명할 수 있는 필드가 있어야 한다. 이 필드는 길이 제한이 없다.
package helloJpa;
import javax.persistence.*;
import java.util.Date;
@Entity
@Table(name="member") //해주지 않는 경우 클래스 네임이 테이블네임이 된다.
public class Member {
@Id
private Long id;
@Column(name = "name") //db에는 name으로 들아간다.
private String username;
private Integer age;
@Enumerated(EnumType.STRING) //db에는 enum타입이 없다. enum을 쓸때는 다음과 같은 어노테이션을 사용해준다.
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP) // TemporalType 안에는 날짜(DATA), 시간(TIME), 날짜시간(TIMESTAMP)가 있다.
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob //긴 컨텐츠를 넣고 싶으면 Lob 어노테이션을 사용한다.
private String description;
@Transient //db컬럼으로 사용하지 않는다.(생성 안됌)(메모리에만 사용함)
private int temp;
public Member() {
}
public Member(Long id, String username) {
this.id = id;
this.username = username;
}
public Long getId() {
return id;
}
public String getUsername() {
return username;
}
public Integer getAge() {
return age;
}
public RoleType getRoleType() {
return roleType;
}
public Date getCreatedDate() {
return createdDate;
}
public Date getLastModifiedDate() {
return lastModifiedDate;
}
public String getDescription() {
return description;
}
public void setId(Long id) {
this.id = id;
}
public void setUsername(String username) {
this.username = username;
}
public void setAge(Integer age) {
this.age = age;
}
public void setRoleType(RoleType roleType) {
this.roleType = roleType;
}
public void setCreatedDate(Date createdDate) {
this.createdDate = createdDate;
}
public void setLastModifiedDate(Date lastModifiedDate) {
this.lastModifiedDate = lastModifiedDate;
}
public void setDescription(String description) {
this.description = description;
}
}
@Column
- name : 필드와 매핑할 테이블의 컬럼 이름
- insertable , updateable : true, false로 사용이 가능하며 등록, 변경 가능 여부를 묻는다. 해당 컬럼 인서트할때나 업데이트를 해도 되는지 (디폴트 : true)
- nullable : create할 때 null값 허용여부를 만든다. false로 설정하면 DDL 생성 시에 not null 제약조건이 붙는다.
- unique : @Table의 uniqueConstraints와 같지만 한 컬럼에 간단히 유니크 제약조건을 걸 때 사용한다. (unique는 잘 사용하지 않는다. ddl을 날릴 때에 unique 키 값을 랜덤으로 생성해서 복잡해진다. 그러므로 @Table 것을 사용하는게 좋다)
- columnDefinition : 컬럼 정의를 직접 할 수 있다. (ex : columnDefinition = "varchar(100) default 'EMPTY'"), 필드의 자바타입과 각 db의 방언 정보를 넣으면 된다.
- length : 문자 길이 제약조건 ,String 타입에만 사용한다 (ddl일 때이다)
- precision, scale : BigDecimal 타입에서 사용한다.(BigInteger도 사용할 수 있다). precision은 소수점을 포함한 전체 자릿수를 ,scale은 소수의 자릿수다. 참고로 double, float 타입에는 적용되지 않는다. 아주 큰 숫자나 정밀한 소수를 다루어야 할 때만 사용한다.
@Enumerated
자바 enum 타입을 매핑할 때 사용
주의! ORDINAL 사용 x
- 속성
ㄴ value
> EnumType.ORDINAL : enum 순서를 데이터베이스에 저장
> EnumType.STRING : enum 이름을 데이터베이스에 저장
기본값 : EnumType.ORDINAL
- EnumType.ORDINAL 를 쓰면 안되는 이유는 다음과 같다.
public enum RoleType {
USER, ADMIN
}
enum이 이런 상태인 경우
Member member = new Member();
member.setId(2L);
member.setRoleType(RoleType.USER);
entityManager.persist(member);
ts.commit();

저장 시에 enum의 순서가 들어간다.
즉 RolType.USER는 0번째 순서이므로 0이 들어간다. 만약 enum이 추가 될 경우 순서가 바뀔 위험한 상황이 생긴다.
그러므로
@Enumerated(EnumType.STRING) //db에는 enum타입이 없다. enum을 쓸때는 다음과 같은 어노테이션을 사용해준다.
private RoleType roleType;
꼭 속성을 EnumType.STRING으로 잡아주고 사용해야 안전하다.
@Temporal
날짜 타입(java.util.Date, java.util.Calendar)을 매핑할 때 사용
참고: LocalDate, LocalDateTime을 사용할 때는 생략 가능(최신 하이버네이트 지원)
속성
-value
- TemporalType.DATE: 날짜, 데이터베이스 date 타입과 매핑 TemporalType.TIME: 시간, 데이터베이스 time 타입과 매핑
(예: 2013–10–11)
-TemporalType.TIME: 시간, 데이터베이스 time 타입과 매핑
(예: 11:11:11)
- TemporalType.TIMESTAMP: 날짜와 시간, 데이터베이스 timestamp 타입과 매핑(예: 2013–10–11 11:11:11)
@Temporal(TemporalType.TIMESTAMP) // TemporalType 안에는 날짜(DATA), 시간(TIME), 날짜시간(TIMESTAMP)가 있다.
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
private LocalDate testLocalDate;
private LocalDateTime testLocalDateTime;
create table member (
id bigint not null,
age integer,
createdDate timestamp,
description clob,
lastModifiedDate timestamp,
roleType varchar(255),
testLocalDate date,
testLocalDateTime timestamp,
name varchar(255),
primary key (id)
)
인서트 문이 이렇게 나가니 그냥 LocalDate나 LocalDateTime을 쓰면 된다.
@Lob
- @Lob에는 지정할 수 있는 속성이 없다.
- 매핑하는 필드 타입이 문자면 CLOB 매핑, 나머지는 BLOB 매핑
> CLOB: String, char[], java.sql.CLOB
> BLOB: byte[], java.sql. BLOB
@Transient
- 필드 매핑X
- 데이터베이스에 저장X, 조회X
- 주로 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때 사용
- @Transient
private Integer temp;
'dev > JPA 기본' 카테고리의 다른 글
다중성 - 다대일과 일대다, (1) | 2024.02.02 |
---|---|
양방향 매핑시 가장 많이 하는 실수 (0) | 2024.02.01 |
양방향 연관관계와 연관관계의 주인 (1) | 2024.02.01 |
단방향 연관관계 (1) | 2024.02.01 |
기본 키 매핑 (1) | 2024.01.31 |
- Total
- Today
- Yesterday
- reject
- 인터셉터
- 항해99
- jpa api
- 스프링공부
- 리터럴
- filter
- Java
- React
- 컨트
- 스프링부트
- JPA
- SpringBoot
- ArgumentResolver
- react실행
- BindingResult
- 백엔드 개발자 공부
- 향해99
- 향해플러스
- Intercepter
- exception
- rejectValue
- thymleaf
- 항해플러스
- 향해플러스백엔드
- hypertexttransferprotocol
- 로그인
- 백엔드 개발자 역량
- HTTP
- 예외처리
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |