엔티티를 영구 저장하는 환경
EntityManger.persist(entity)-> DB에 저장한다는 의미가 아니라 영속성 컨텍스트를 통해서 entity를 영속한다는 뜻
: application과 database 사이의 중간 계층이 있는 개념.
영속적이다 -> 그 사이 공간에 올라간 것
비영속적 -> 사이 공간에 올라가지 않은 것
DB에서는 값을 조회하면 영속성 콘텍스트 1차캐시에 값을 올려놓는다.
Application < - JPA -> Database
App에서 data를 가져올 때 Jpa 안의 1차 캐시에서 값을 조회해보고 있으면 그 1차캐시 안의 값을 가져온다. 만약 값이 없다면 Jpa에서 db에서 값을 추출하고 그 후에 값을 App에 return한다.
그러나 Jpa는 db transaction 단위로 움직이기 때문에 transaction이 끝나면 캐시 역시 지워진다. 고로 효율성에 있어서는 그닥이다.
EntityManger.persist(entity)persist에서 query를 날리는게 아니라 commit()에서 쿼리를 날린다.
EntityManagerFactory emf = Persistence.createEntityManagerFactory()
EntityManager em = emf.createEntityManager()
EntityTransaction tx = em.getTransaction()
...
EntityManger.persist(entity)
tx.commit() <--- 이때 쿼리를 날린다
버퍼링 같은 개념으로 사용하는 것 ( 버퍼링을 모아서 write 가능 )
java collection 다루듯이 객체를 다루는 것
JPA는 값을 바꾸면 transaction이 commit 되는 시점에 변경을 반영한다.
pseudo code
Update entity
Call Entity Manager persist (x)
-> 알아서 변경된다
변경감지
수정된 엔티티 쓰기 지연 SQL 저장소 등록
저장된 쿼리를 날림

1차 캐시에 올라간 상태 = 영속상태
em.persist를 통했을 때도 영속상태가 되지만, em.find를 통해서 영속성 콘텍스트에 올렸을 때도 영속상태가 된다.
영속상태의 entity를 영속성 콘텍스트에서 분리하는 것 ( 그러면 영속성 콘텍스트가 제공하는 기능 사용못함 )
@Entity가 붙은 것은 Jpa가 관리한다
기본생성자 필수,final , enum, interface, inner 클래스 사용 x