데이터베이스를 하나만 사용하는 애플리케이션은 일반적으로 EntityManagerFactory를 하나만 생성합니다.
EntityManagerFactory emf =
Persistence.createEntityManagerFactory("example");
Persistence.createEntityManagerFactory("example");를 호출하게 되면 META-INF/persistence.xml에 있는 정보를 바탕으로 EntityManagerFactory를 생성합니다.
EntityManagerFactory를 만들었다면 이제 필요할 때마다 만들어둔 EntityManagerFactory에서 EntityManager를 생성하면 됩니다.
EntityManager em = emf.createEntityManager();
EntityManagerFactory를 만드는 비용은 상당히 큽니다. 따라서 한 개만 만들고 애플리케이션 전체에서 공유하도록 설계가 되어있습니다.
반면 EntityManagerFactory에서 EntityManager를 찍어내는 것은 비용이 거의 들지 않습니다.
또한, EntityManagerFactory는 여러 스레드가 동시에 접근해도 안전합니다. 그렇기 때문에 서로 다른 스레드 간 공유해도 상관이 없지만, EntityManagersms 여러 스레드가 동시에 접근하게 되면 동시성 문제가 발생할 수 있기 때문에 스레드 간 절대로 공유하면 안됩니다.

위 그림을 보면 하나의 EntityManagerFactory에서 다수의 EntityManager를 생성합니다.
EntityManger는 데이터베이스 연결이 꼭 필요한 시점까지 커넥션을 얻지 않습니다. 그렇기 때문에 EntityManager2와 달리 EntityManager1은 아직 데이터베이스 커넥션을 사용하지 않고 있습니다.
EntityManager2는 커넥션을 사용 중인데, 보통 트랜잭션을 시작할 때 커넥션을 획득합니다.