728x90
반응형
엔티티 맵핑 소개
- @Entity, @Table: 객체와 테이블을 맵핑할때 사용한다.
- @Column: 필드와 컬럼매핑
- @Id: 기본 키 매핑
- @ManyToOne, @JoinColumn: 연관관계 매핑
객체와 테이블 맵핑
사용법 및 주의점
- @Entity: 해당 어노테이션이 붙은 클래는 JPA가 관리, 엔티티 라고한다.
- JPA 를 사용해서 테이블과 매핑할 클래스는 @Entity가 필수다. - 기본생성자는 필수로 작성해줘야 한다.
- final 클래스 enum, interface, inner 클래스 사용 하면 안된다.
- 저장할 필드에 final 사용 하지 않는다.
@Entity 어노테이션
- name 속성을 가지고 있다.
- JPA에서 사용할 엔티티 이름을 지정한다
- 기본값은 class 이름을 그대로 사용한다.
- 같은 클래스 이름이 있을때 써준다.
- 보통은 잘 사용하지 않는다.
// 꼭넣어야 한다.
// JPA가 로딩 될때 해당 어노테이션을 보고 인식한다.
@Entity
public class Member {
private Long id;
private String name;
//JPA 는 기본생성자가 있어야 한다.
public Member() {
}
}
@Table 어노테이션
- name 속성
- 저장될 테이블 명을 사용자가 지정할수 있다.
- 기본 값은 엔티티 이름을 사용한다. - 아래처럼 @Table(name = "USER") USER로 해주면
저장될때 테이블명이 USER 로된다.
// 꼭넣어야 한다.
// JPA가 로딩 될때 해당 어노테이션을 보고 인식한다.
@Entity
@Table(name = "USER") // 테이블명 지정
public class Member {
private Long id;
private String name;
//JPA 는 기본생성자가 있어야 한다.
public Member() {
}
}
- catalog
데이터베이스 catalog 매핑 - schema
데이터베이스 schema 매핑 - uniqueConstraints(DDL)
DDL 생성시 유니크 제약 조건 생성
필드와 컬럼 맵핑
@Column 어노테이션
속성
- name: 필드와 매핑할 컬럼이름을 직접 지정 할 수 있다.
- insertable, updatable: 데이터 변경시 DB에 반영할지 말지 여부를 정할수 있다.
- nullable: null 값의 혀용 여부를 설정한다
- false 일 경우 DDL 생성시 not null 제약 조건이 붙는다. - unique: @Table의 uniqueConstraints와 같지만 한 컬럼에 유니크 제약조건을 걸 때 사용한다.
- columnDefinition: 데이터 베이스 컬럼 정보를 직접 줄 수 있다.
- length: 문자길이 제약조건, String 타입에만 사용된다.
- percesion, scale: BigDecimal 타입에서 사용한다.
- precision은 소수점을 포함한 전체 자 릿수를 scale은 소수의 자릿수를 지정한다.
package hellojpa.columnmapping;
import javax.persistence.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
// 꼭넣어야 한다.
// JPA가 로딩 될때 해당 어노테이션을 보고 인식한다.
@Entity
public class ColumnMember {
// 컬럼이름을 지정해준다.
// insertable: 컬럼을 수정시 DB 인서트 할것인지
// updateable: 수정시 업데이트 할 것인지 안할 것인지
// 둘다 false 로 하면 DB에 변경 내용이 들어 가지 않는다.
// nullable: false일 경우 not null 제약 조건이 적용된다.
// unique: 제약 조건을 만들어 준다. 하지만 여기서걸면 이름이 맘대로 생성
// 그래서 @Table 에서 걸어준다.
@Column(name = "name", nullable = false, length = 100)
private String name;
}
@Enumerated
자바의 enum 타입을 매핑할때 사용한다.
참고로 DB에는 enum 타입이 없기 때문에 해당 매핑이 필요하다.
속성
- EnumType.ORDINAL: enum 순서를 DB에 저장, 0 ,1 ,2 3
- EnumType.STRING: enum 이름을 데이터베이스에 저장
주의점
- Enumerated 를 사용할 경우 ORDINAL은 사용하면 안된다.
- 순서가 바뀌거나 새로운 타입이 추가 됐을경우 문제가 심각하다.
package hellojpa.columnmapping;
import javax.persistence.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
// 꼭넣어야 한다.
// JPA가 로딩 될때 해당 어노테이션을 보고 인식한다.
@Entity
//@Table(name = "USER") // 테이블명 지정
public class ColumnMember {
//DB 에는 enum 타입이 없기 때문에 Enumerated로 맵핑해준다.
// EnumType은 무조건 String으로 한다.
@Enumerated(EnumType.STRING)
private RoleType roleType;
}
@Temporal
날짜 타임 을 매핑할때 사용된다.
속성
- TemproalType.DATE: 날짜, DB 의 date 타입과 매핑
- TemproalType.TIME: 시간 데이터베이스 time 타입과 매핑
- TemporalType.TIMESTAMP: 날짜, 기간 데이터 베이스 timestamp 타입과 매핑
참고
LocalDate, LocalDateTime을 사용할 떄는 생략 가능하다.
package hellojpa.columnmapping;
import javax.persistence.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
// 꼭넣어야 한다.
// JPA가 로딩 될때 해당 어노테이션을 보고 인식한다.
@Entity
//@Table(name = "USER") // 테이블명 지정
public class ColumnMember {
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
private LocalDate testLocalDate;
private LocalDateTime testLocalDataTime;
}
@Lob
데이터 베이스 BLOB, CLOB 타입과 매핑
속성
- @Lob에는 지정할 수 있는 속성이 없다.
매핑하는 필드 타임이 문자면 CLOB, 나머지는 BLOB 매핑이된다. - CLOB: String, charp[], java.sql.CLOB
- BLOB: byte[], java.sql.BLOB
@Transient
필드매핑을 안할때 사용한다.
데이터 베이스에 해당필드는 저장 되지 않고 조회 할수 없다.
메모리상에서만 임시로 사용할때 지정
@Transient
private Integer temp;
요구사항
1. 회원은 일반, 관리자로 나뉜다.
2. 회원 가입일과 수정일이 있다.
3. 회원을 설명하는 필드가 있다. 길이 제한이 없다.
ColumnMember
package hellojpa.columnmapping;
import javax.persistence.*;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.util.Date;
// 꼭넣어야 한다.
// JPA가 로딩 될때 해당 어노테이션을 보고 인식한다.
@Entity
//@Table(name = "USER") // 테이블명 지정
public class ColumnMember {
@Id //PK 설정
private Long id;
// 컬럼이름을 지정해준다.
// insertable: 컬럼을 수정시 DB 인서트 할것인지
// updateable: 수정시 업데이트 할 것인지 안할 것인지
// 둘다 false 로 하면 DB에 변경 내용이 들어 가지 않는다.
// nullable: false일 경우 not null 제약 조건이 적용된다.
// unique: 제약 조건을 만들어 준다. 하지만 여기서걸면 이름이 맘대로 생성
// 그래서 @Table 에서 걸어준다.
@Column(name = "name", nullable = false, length = 100)
private String name;
private Integer age;
//DB 에는 enum 타입이 없기 때문에 Enumerated로 맵핑해준다.
// EnumType은 무조건 String으로 한다.
@Enumerated(EnumType.STRING)
private RoleType roleType;
// DB 에는 Date, Time, Data+time 이 있기 때문에 맵핑으로 지정해준다.
// 날짜타입에 쓰는건데 지금은 필요없다.
// 그냥 LocalDate 를 쓰면된다.
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
private LocalDate testLocalDate;
private LocalDateTime testLocalDataTime;
// VACHAR 보다 큰 경우 사용한다.
@Lob
private String description;
//JPA 는 기본생성자가 있어야 한다.
public ColumnMember() {
}
}
참고
https://www.inflearn.com/course/ORM-JPA-Basic/lecture/21695?tab=curriculum&speed=1
728x90
반응형
'DataBase > JPA' 카테고리의 다른 글
[JPA] 기본키 맵핑 (0) | 2021.07.31 |
---|---|
[JPA] 데이터베이스 스키마 자동 생성 (0) | 2021.07.30 |
[JPA] 준영속성 (0) | 2021.07.30 |
[JPA] 플러시 (0) | 2021.07.30 |
[JPA] 영속성 컨텍스트 (0) | 2021.07.30 |
댓글