EntityManagerFactory entityManagerFactory = new EntityManagerFactory();
EntityManager em = entityManagerFactory.createManager();
EntityTransaction tx = em.getTransation();
tx.begin();
// em 관련 처리
...
tx.commit() or tx.rollback();
em.close();
EntityManager.persist(entity); 영속성 컨텍스트에 저장하는 것
```java
//new로 생성하여 아직 영속되지 않은 상태를 말함.
//persist() 이전
EntityObject entityObj = new EntityObj();
entityObj.set("field");
```
```java
///persist()를 사용 했을 경우
entityManager.persist(entityObj); // 컨텍스트에 영속된 상태.
//merge() 준영속 상태를 다시 영속으로 바꿨을 때 다시 영속으로 바뀐다.
```
```java
entityManager.detach(entityObj); // 영속성 컨텍스트에서 특정 엔티티를 지운다.
entityManager.clear(entityObj); // 영속성 컨텍스트의 모든 캐싱된 엔티티를 초기화 한다.
entityManager.close(); //영속성 컨텍스트를 종료한다.
```
```java
entityManager.removed(entityObj) // 객체를 삭제한다. 딜리트 쿼리 요청.
```
1차 캐시 기능
을 가지고 있다. ```java
//트랜잭션 단위는 일반적으로 entityManager가 닫힐 때 까지다.
// 한번 가져오면 캐싱이 되어 다시 불러 오더라도 쿼리문이 아닌 캐시에서 가져온다.
EntityObj obj1 = entityManager.find(EntityObj.class, condition);
EntityObj obj2 = entityManager.find(EntityObj.class, condition);
obj1.equals(obj2) == true
```
쓰기 지연
기능을 제공한다. ```java
EntityObj obj1 = new EintityObj();
EntityObj obj2 = new EintityObj();
obj1.setId(1L);
obj2.setId(1L);
entityManager.persist(obj1); // 영속성 컨텍스트 쓰기 지연 저장소에 저장
entityManager.persist(obj2); // 쓰기 지연 저장소에 저장
entityTransaction.commit(); // fulsh가 동작하고 commit
```
변경 감지
```java
EntityObj obj = entityManager.find(EntityObj.class, condition);
obj.setfield("updated"); // 영속성 컨텍스트 캐시에 바꾼 값으로 엔티티가 저장.
entityTransation.commit(); // flush가 작동하면서 스냅샷을 비교하여 바뀐 엔티티에 대해 update 쿼리 생성
```