[JPA] JPA Entity

2023. 10. 25. 20:44
728x90

JPA가 뭐였지? > 결국은 쿼리문 없이 데이터를 이리저리 움직이는 것...

이번에는 엔터티와 직접 아키텍쳐...?를 따라가 보자...

 

1. Entity

: 데이터 베이스 테이블과 맵핑되는 자바 클래스로 데이터를 포함하지만 중요한 로직은 포함하지 않는다.

 

1) @Entity 애너테이션 달기.

  • 이 때 JPA가 엔티티 객체를 생성할 때 내부적으로 기본 생성자를 사용하므로 꼭 !!! 기본 생성자 작성 필수
  • 접근 제어자는 `protected` 적용 권장.
  • 값 저장할 필드에는 final 사용 불가.

 

2) @Id, @GeneratedValue 애너테이션 달기 : PRIMARY KEY 설정

  • IDENTITY : 기본 키의 생성을 DB에게 위임
  • SEQUENCE : DB의 시퀀스 사용해서 기본키 할당 (오라클만 가능)
  • TABLE : 키 생성용 별도 테이블 사용
  • AUTO : DB에 맞는 PK값 생성 전략을 자동으로 지정

3) @Column 애너테이션 달기 : 객체 필드를 테이블의 컬럼으로 매핑

  • name : 컬럼 이름
  • nullable : DDL 생성 시 null 값의 허용 여부 (false면 NOT NULL 제약조건/ 기본값 true)
  • columnDefinition : 데이터베이스 컬럼 정보를 직접 줄 수 있음 (ex.columnDefinition = "varchar (100) default 'EMPTY'")

ex. Book.java 클래스

package dev.syntax.model;

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

@Entity
@Table(name = "BOOKS")
public class Book {

	@Id
	@GeneratedValue(strategy = GenerationType.SEQUENCE)
	private int id;

	@Column(name = "book_name", nullable = false)
	private String bookName;

	private String author;

	@Temporal(TemporalType.TIMESTAMP) // util.date, util.Calendar 맵핑 시 사용
	/**
	 * TemporalType.DATE: 날짜, DB의 date 타입과 맵핑 (ex. 2022-03-03) TemporalType.DATE:
	 * 날짜, DB의 date 타입과 맵핑 (ex. 09:30:23) TemporalType.TIMESTAMP: 날짜와 시간, DB의
	 * timestamp 타입과 맵핑(ex.2022-12-27 09:53:34)
	 */
	@Column(name = "pub_date")
	private Date pubDate;

	//기본 생성자 필수
	protected Book() {
		super();
		System.out.println("Default Constructor book() called");
	}

	public Book(String bookName, String author, Date pubDate) {
		super();
		this.bookName = bookName;
		this.author = author;
		this.pubDate = pubDate;
	}

	public int getId() {
		return id;
	}

	public String getBookName() {
		return bookName;
	}

	public String getAuthor() {
		return author;
	}

	public Date getPubDate() {
		return pubDate;
	}

	public void updateBookName(String bookName) {
		this.bookName = bookName;
	}

	@Override
	public String toString() {
		return "Book [id=" + id + ", author=" + author + ", bookName=" + bookName + "]";
	}

}

 

 

2. 자바 메인 파일 실행 단계

~ 순서 ~

1) Persistence 클래스를 통해 EntityManagerFactory 인스턴스 생성

2) 생성된 EntityManagerFactory는 Persistence unit인 persistence.xml 파일을 통해 설정 정보 구성됨.

3) EntityManagerFactory를 통해 EntityManager 인스턴스 생성

4) EntityManager를 통해 Entity 관리됨.

5) Entity 관리는 영속성 컨텍스트(persistence context)에서 관리.

 

요 순서 그대로 선언을 해보자.

 

1) EntityManagerFactory  factory = Persistence.createEntityManagerFactory("step01");

2) EntityManager  manager = factory.createEntityManager();

3) EntityTransaction transaction = manager.getTransaction(); >> 데이터를 변경하는 모든 작업은 반드시 트랜잭션 안에서 이루어져야 한다. 

 

4) transaction.begin(); >> 트랜잭션 시작

5) Book book = new Book("JPA", "무명", new Date()); >>book 객체 생성

6) manager.persist(book); >> 영속성 컨텍스트에 Entity 보관 + INSERT 쿼리 보관

7) transaction.commit(); >> 하는 순간 DB INSERT 쿼리 수행.

package dev.syntax;

import java.util.Date;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.EntityTransaction;
import javax.persistence.Persistence;
import dev.syntax.model.Book;

public class Step02DoPersist {
	public static void main(String[] args) {

		EntityManagerFactory factory = Persistence.createEntityManagerFactory("step01");
		EntityManager manager = factory.createEntityManager();		
		EntityTransaction transaction = manager.getTransaction();
		
		try {
			transaction.begin();
			Book book = new Book("JPA", "무명", new Date());			
			manager.persist(book); 
			transaction.commit(); 						
		} catch (Exception e) {		
		}		
	}
}

 

 

(sql문 작성하느라 고생했는데... JPA 너무 신기해!!!!)

728x90

BELATED ARTICLES

more