테이블 < - > @Entity 매핑은 그냥 뭐 이름정도 맞춰준다거나 별거 없는데,
필드랑 컬럼은 좀 타입이라던지 몇개 있음.
요구사항
1. 일반회원과 관리자로 구분
2. 회원가입일과 수정일이 있어야 함.
3. 회원을 설명할 수 있는 필드가 있어야 하며, 이 필드는 길이제한이 없다.
?? 3번은 좀 위험한거 아닌가..
여튼 그러면
id, username, 생성일, 수정일, 설명, 역할
요 6개쯤?
@Entity
public class Member {
@Id
private Long id;
@Column(name="name")
private String username;
private Integer age;
@Enumerated(EnumType.STRING)
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP)
private Date createDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob
private String description;
public Member(){}
}
@Entity로 하고
id는 @Id로 JPA가 인식하게 하고
필드명은 username으로 하고 싶은데 테이블명이 name인 케이스 인가 봄
age는 넘어가고,
@Enumerated(EnumType.STRING)
이거는 일단, 저 타입이 Enum이라는 거임.
그리고 속성으로 EnumType.STRING을 넣어줬는데,
이게 default가 EnumType.ORDINAL임.
말 그대로 문자열로 할거냐, 순서로 할거냐.
당연 문자열이 더 정확함. 그냥 무조건 문자열로 쓴다고 생각하면 됨.
public enum RoleType {
USER, ADMIN
}
만약 여기다 맨 앞에 GUEST 추가하면 원래 USER가 0번이었는데 GEUST가 0번 되는거임.
@Temporal 시간 관련이란 뜻. DB에도 시간타입이 있기에, 이렇게 시간관련 필드라고 해 줘야 함.
그 다음 TemporalType, 즉 시간 타입이다 이거임.
보통 자바에는 날짜랑 시간 묶어서였나 그런데,
DB에서는 DATE(날짜), TIME(시간), TIMESTEMP(날짜와 시간) 이렇게 3가지가 있음.
그래서 지정을 해 줘야 함.
여튼 지정해 줬고,
@Lob는 varchar를 넘어선 굉장히 큰 데이터를 쓰고 싶을 때 넣으면 된다.
필드에서 String일 경우에는 CLOB 타입이 되고, 다른 것 이면 BLOB 타입이 된다.
CLOB은 char lob 뭐 그런 것 같고,
BLOB은 byte lob 인 듯 하다.
그리고, 여기엔 안나왔는데
@Transient 라는 것이 있다.
이거는 매핑을 안하고 싶은, 즉 테이블 정보에 넣고 싶지 않은 필드이다. 즉 그냥 객체의 필드이다. 테이블과 연관없는.
다음, @Column의 속성에 대해 자세히
name은 테이블의 열명을 적어주면 된다. 기본값은 객체의 필드 이름이다.
insertable, updatable은 저거 false로 해두면 insert 쿼리 날리거나 update 쿼리 날릴 때 반영이 되지 않는 것 이다.
뭐 등록하기 싫다거나, 아니면 변경(update)하기 싫다거나 할 때 씀.
nulldable은 말 그대로 null 할 수 있는지 여부
unique 저건 잘 안씀. 유니크 한답시고 UUID처럼 열이름이 이상한 문자처럼 보이게 됨. 어떻게 식별함.
보통 저런 거 하고 싶으면 설명처럼 @Table에다가 uniqueConstraints 함.
저렇게 하면 이름까지 원하는 데로 줄 수 있다고 함.
열에 대한 정의를 직접 하고 싶다면,
columnDefinition = "옵션들"
DB에 create table할 때 타입과 옵션들 줄 때 처럼 하면 된다.
length는 길이.
precision이나 scale은 아주 큰 숫자 혹은 소수점 DB에 넣고 싶다고 할 때 사용한 다고 함.
자바에서는 BigDecimal이나 BigInteger도 사용 가능함
@Temporal 이것도 사실 이제 옛날거다.
java 8 나오면서 LocalDate, LocalDateTime이 나왔는데,
이게 JPA에서 DB의 Date로 인지가 된다.
그래서 하이버네이트 요즘꺼 쓰면 그냥 쓰면 됨. 따로 애노테이션 안 붙여도
당연히 Date는 날짜,
DateTime은 시간까지.
LocalDate는 DB의 테이블에서 Date 타입으로,
LocalDateTime은 DB의 테이블에서 timestamp 타입으로
'JPA > JPA 기본' 카테고리의 다른 글
14. 예제 (0) | 2023.10.22 |
---|---|
13. 기본 키 매핑 (0) | 2023.10.21 |
11. DB 스키마 자동 생성 (0) | 2023.10.21 |
10. 객체와 테이블의 매핑 (0) | 2023.10.21 |
9. 준영속 상태 (0) | 2023.10.20 |