728x90
📌 @Column 컬럼 매핑
1) name
@Column(name = "name")
private String username;
- 필드와 매핑할 테이블의 컬럼 이름
- 데이터베이스에 저장되는 이름을 name ="" 으로 지정할 수 있다.
2) insertable, updateable
@Column(name = "name", updatable = "false")
private String username;
- insertable = "false" 로 지정할 경우, 데이터베이스 스키마 자동 생성에서 해당 필드는 제외된다.
- updatable = "false" 로 지정할 경우, 업데이트에서 제외된다.
3) nullable
@Column(name = "name", nullable = false)
private String username;
- nullable = true : null 을 허용한다
- nullable = false : null 을 허용하지 않는다 (not null)
4) unique
@Column(name = "name", unique="true")
private String username;
- @Table(uniqueConstraints = {name=""}) 와 같다.
- 단일 컬럼에 unique 키를 지정할 때 사용된다.
- 설정 시, UUID가 적용된 랜덤 이름을 부여하기에 식별하기에 어렵다. 따라서 사용하는 것을 권장하지 않는다.
5) columnDefinition
@Column(columnDefinition = "TEXT")
private String content;
- 데이터베이스 컬럼 정보를 직접 줄 수 있다.
- 예) content 컬럼의 정보를 "TEXT"로 부여하면, TEXT 정보로 저장된다.
6) length
@Column(name = "name", length="10")
private String username;
- String 타입에서만 사용된다.
- 특정 컬럼의 길이 제약조건을 걸 수 있다.
📌 @ Temporal 날짜 타임 매핑
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
1 ) TemporalType.DATE
- 날짜, 데이터베이스 date 타입과 매핑한다.
- 2023-12-12
2 ) TemporalType.TIME
- 시간, 데이터베이스 time 타입과 매핑한다.
- 11:11:11
3 ) TemporalType.TIMESTAMP
- 날짜와 시간, 데이터베이스 timestamp 타입과 매핑한다.
- 2023-12-12 11:11:11
📌 @Enumerated enum 타입 매핑
1 ) EnumType.ORDINAL
@Enumerated(EnumType.ORDINAL)
private RoleType roleType;
- EnumType 의 기본 값
- EnumType.ORDINAL: enum 순서를 데이터베이스에 저장
- Enum class에 정의해둔 순서에 따라 0, 1, 2 ... 와 같이 DB에 저장이 된다.
- 순서 기준으로 생성되는 컬럼이므로 추후 Enum class 가 변경될 시에 문제가 생기기 쉽다. 가급적 사용하지 말자
2 ) EnumType.STRING
@Enumerated(EnumType.STRING)
private RoleType roleType;
- EnumType.STRING: enum 이름을 데이터베이스에 그대로 저장
- varchar 로 저장이 된다.
📌 @Lob
1 ) CLOB
@Lob
private String description;
- 매핑하는 필드 타입이 문자는 기본적으로 CLOB으로 매핑된다.
- String, char[], java.sql.CLOB
2 ) BLOB
- 문자 타입이 아닌 필드에 매핑될 때 BLOB으로 된다.
- byte[]. java.sql.BLOB
📌@Transient
@Transient
private Integer temp;
- 데이터베이스에 저장하거나 조회하고 싶지 않을 때 사용한다.
- 오직 메모리상에서만 임시로 어떤 값을 보관하고 싶을 때 사용한다.
📌@GeneratedValue
1 ) GenerationType.IDENTITY
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
- 기본 키 생성을 데이터베이스에게 맡긴다
- 주로 MySQL, SQL Server, PostgreSQL 에서 사용
- 트랜잭션 커밋 시점에 INSERT SQL 실행
- AUTO_INCREMENT는 데이터베이스에 INSERT SQL을 실행한 이후에 ID값을 알 수 있다. 즉, Insert 가 된 이후에 DB에 다녀와야한다. 또한 성능 최적화를 위해 데이터를 모은 후에 한 번에 커밋하는 것이 불가능하다.
- em.persist() 시점에 즉시 INSERT SQL을 실행 하고 DB에서 식별자를 조회한다.
2 ) GenerationType.SEQUENCE
Member
@Entity
@SequenceGenerator(name = "MEMBER_SEQ_GENERATOR",
sequenceName = "MEMBER_SEQ", // 매핑할 DB 시퀀스 이름
initialValue = 1, allocationSize = 50)
public class Member {
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "MEMBER_SEQ_GENERATOR")
private Long id;
@Column(name = "name")
private String username;
public Member(){
}
}
- 유일한 값을 순서대로 생성하는 특별한 데이터베이스 오브젝트이다.
- Oracle, PostgreSQL, DB2, H2 데이터베이스에서 사용된다.
- @SequenceGenerator 가 필요하다.
- allocationSize
- 기본 값 : 50
- 시퀀스 한 번 호출에 증가하는 수
- 데이터베이스 시퀀스 값이 하나씩 증가하도록 설정되어 있으면, 이 값을 반드시 1로 설정해야한다.
- 성능 최적화에서 사용된다.
- DB에서 다녀와 1~50까지의 공간을 확보 후, 이후 Id 값은 메모리상에서 호출된다.
JpaMain
public class JpaMain {
public static void main(String[] args) {
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
EntityManager em = emf.createEntityManager();
EntityTransaction tx = em.getTransaction();
// 엔티티 매니저는 데이터 변경시 트랜잭션 시작
tx.begin(); // [트랜잭션] 시작
try {
Member member1 = new Member();
member1.setUsername("A");
Member member2 = new Member();
member2.setUsername("B");
Member member3 = new Member();
member3.setUsername("C");
System.out.println("==============");
em.persist(member1); // 1, 51 까지의 공간을 확보 (DB에 다녀옴)
em.persist(member2); // Memory에만 갔다옴 -> sequence 전략으로 하면 한 번에 모았다가 저장하는게 가능
em.persist(member3); // Memory
System.out.println("member1 : "+ member1.getId());
System.out.println("member2 : "+ member2.getId());
System.out.println("member3 : "+ member3.getId());
System.out.println("==============");
tx.commit(); // [트랜잭션] 커밋
}catch (Exception e){
tx.rollback();
}finally {
em.close();
}
emf.close();
}
}
- member2 와 member 3은 DB에서 호출하지 않고 메모리에서 호출된다.
해당 결과
처음 호출 : call next value for MEMBER_SEQ
-> DB SEQ = 1
두번째 호출 : call next value for MEMBER_SEQ -> DB SEQ = 51
공간 확보 후, member 1 / 2 / 3 의 seq가 부여된다.
3 ) GenerationType.AUTO
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
- Oracle, MySQL 등 각자 데이터베이스에 맞게 자동 지정된다.
🐾 적용된 코드 보기
@Entity
public class Member {
@Id
private Long id;
@Column(name = "name") // DB 컬럼명은 name 이야
private String username;
private Integer age;
@Enumerated(EnumType.STRING)
private RoleType roleType;
@Temporal(TemporalType.TIMESTAMP)
private Date createdDate;
@Temporal(TemporalType.TIMESTAMP)
private Date lastModifiedDate;
@Lob // 문자타입은 기본적으로 clob으로 된다.
private String description;
@Transient // DB가 아닌 메모리상에서만 사용한다.
private int temp;
}
728x90
'LANGUAGE > Java' 카테고리의 다른 글
[JPA] 프록시와 즉시/지연 로딩 전략 (0) | 2024.01.22 |
---|---|
[JPA] @MappedSuperclass (0) | 2024.01.01 |
[JPA] 상속관계 매핑 정리- 3가지 전략 JOINED, SINGLE_TABLE 등 (0) | 2023.12.31 |