2023. 12. 28. 01:20ㆍspring/JPA
1. 엔티티 매니저 팩토리와 엔티티 매니저
데이터베이스를 하나만 사용하는 애플리케이션은 일반적으로 EntityManagerFactory를 하나만 생성한다(비용이 비쌈)
EntityManagerFactory emf = Persistence.createEntityManagerFactory("hello");
Persistence.createEntityManagerFactory("hello")를 호출하면 META-INF/persistence.xml에 있는 정보를 바탕으로 EntityManagerFactory를 생성한다.
<?xml version="1.0" encoding="UTF-8" ?>
<persistence version="2.2"
xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
<persistence-unit name="hello">
<properties>
<!--필수-->
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<!--옵션-->
<property name="hibernate.show_sql" value="true"/>
<property name="hibernate.format_sql" value="true"/>
<property name="hibernate.use_sql_comments" value="true"/>
<property name="hibernate.jdbc.batch_size" value="10"/>
</properties>
</persistence-unit>
</persistence>
엔티티 매니저 팩토리가 생성된 후 필요할 때마다 엔티티 매니저를 생성하면 된다.(비용이 거의 안 든다)
EntityManager entityManager = emf.createEntityManager();
주의* 엔티티 매니저 팩토리는 스레드 안전하지만 엔티티 매니저는 스레드 안전하지 않다.
그림을 보면 하나의 EntityManagerFactory에서 다수의 엔티티 매니저를 생성했다. EntityManager!은 아직 데이터베이스 커넥션을 사용하지 않는데, 엔티티 매니저는 데이터베이스 연결이 꼭 필요한 시점까지 커넥션을 얻지 않는다. EntityManager2는 커넥션을 사용중인데 보통 트랜잭션을 시작할 때 커넥션을 획득한다.
2. 영속성 컨텍스트란?
엔티티를 영구 저장하는 환경이라는 의미다. 엔티티 매니저로 엔티티를 저장하거나 조회하면 엔티티 매니저는 영속성 컨텍스트에 엔티티를 보관하고 관리한다.
entityManager.persist(member);
영속성 컨텍스트는 논리적인 개념에 가깝고 눈에 보이지 않는다. 영속성 컨텍스트는 엔티티 매니저를 생성할 때 하나 만들어진다. 엔티티 매니저를 통해 영속성 컨텍스트에 접근할 수 있고, 영속성 컨텍스트를 관리할 수 있다.
3. 엔티티의 생명주기
엔티티는 4가지 상태가 존재한다.
- 비영속 : 영속성 컨텍스트와 관계가 없는 상태
Member member = new Member();
member.setId(6L);
member.setName("Hello");
- 영속 : 영속성 컨텍스트에 저장된 상태
entityManager.persist(member);
Member findMember = entityManager.find(Member.class, 6L)
- 준영속 : 영속선 컨텍스트에 저장되었다가 분리된 상태
entityManager.detach(member);
- 삭제 : 삭제된 상태
entityManager.remove(member);
'spring > JPA' 카테고리의 다른 글
고급매핑 - 상속 관계 매핑 (0) | 2024.01.15 |
---|---|
연관관계 매핑(2) - 단방향, 양방향 (0) | 2024.01.04 |
엔티티 매핑(2) - 컬럼 매핑 (0) | 2024.01.03 |
엔티티 매핑(1) - 엔티티, 기본 키 매핑 (1) | 2023.12.29 |
영속성 관리(2) (0) | 2023.12.28 |