복붙노트

[SPRING] LocalContainerEntityManagerFactoryBean과 LocalEntityManagerFactoryBean의 차이점은 무엇입니까?

SPRING

LocalContainerEntityManagerFactoryBean과 LocalEntityManagerFactoryBean의 차이점은 무엇입니까?

아무도 Spring Framework의 LocalContainerEntityManagerFactoryBean과 LocalEntityManagerFactoryBean의 차이점을 설명 할 수 있습니까?

해결법

  1. ==============================

    1.기본적으로 JPA 스펙은 두 가지 유형의 엔티티 관리자를 정의합니다. 그들은 : i) 응용 프로그램 관리 : 응용 프로그램 관리 엔티티 관리자는 "엔티티 관리자는 응용 프로그램 (즉, 코드)만으로 작성되고 관리됩니다."를 의미합니다.

    기본적으로 JPA 스펙은 두 가지 유형의 엔티티 관리자를 정의합니다. 그들은 : i) 응용 프로그램 관리 : 응용 프로그램 관리 엔티티 관리자는 "엔티티 관리자는 응용 프로그램 (즉, 코드)만으로 작성되고 관리됩니다."를 의미합니다.

    ii) 컨테이너 관리 : 컨테이너 관리되는 엔티티 관리자는 "엔티티 관리자는 J2EE 컨테이너만으로 생성되고 관리됩니다. 즉, 코드가 직접 관리하지 않고 엔티티 관리자가 컨테이너에서 생성되고 관리되며 코드가 EM을 얻습니다. JNDI 사용).

    참고 : Created and Managed (위)는 "트랜잭션에서 엔티티 관리자 열기, 닫기 및 관련"을 의미합니다.

    LocalContainerEntityManagerFactoryBean - 컨테이너 관리 LocalEntityManagerFactoryBean - 응용 프로그램 관리

    큰 참고 사항 : 스프링 기반 응용 프로그램의 경우 차이점은 많지 않습니다. Spring은 역할 만 수행합니다 (LocalContainerEntityManagerFactoryBean을 구성하는 경우 컨테이너로, LocalEntityManagerFactoryBean을 구성하는 경우 응용 프로그램으로).

  2. ==============================

    2.설명서에 모두 나와 있습니다.

    설명서에 모두 나와 있습니다.

    LocalContainerEntityManagerFactoryBean - 링크에서 : JPA 표준 컨테이너 부트 스트랩 계약에 따라 JPA EntityManagerFactory를 작성하는 FactoryBean.

    LocalEntityManagerFactoryBean - 링크에서 : JPA의 표준 독립형 부트 스트랩 계약에 따라 JPA EntityManagerFactory를 작성하는 FactoryBean.

    본질적으로 유일한 차이점은 JPA EntityManagerFactory를 만드는 방법에 있습니다.

  3. ==============================

    3.LocalEntityManagerFactoryBean

    LocalEntityManagerFactoryBean

    가장 단순하고 제한적입니다. 기존 JDBC를 참조 할 수 없습니다. DataSource Bean 정의 및 전역 트랜잭션에 대한 지원이 없습니다.

    LocalContainerEntityManagerFactoryBean

    가장 강력한 JPA 설정입니다. 옵션으로 응용 프로그램 내에서 유연한 로컬 구성이 가능합니다. 기존 JDBC DataSource에 대한 링크를 지원하고 로컬 및 글로벌 트랜잭션을 모두 지원합니다.

    REF : spring-framework-reference.pdf "봄 3"

  4. ==============================

    4.LocalEntityManagerFactoryBean은 응용 프로그램 관리 EntityManagerFactory를 생성합니다.

    LocalEntityManagerFactoryBean은 응용 프로그램 관리 EntityManagerFactory를 생성합니다.

    LocalContainerEntityManagerFactoryBean은 container-managed를 생성합니다. EntityManagerFactory.

    참조 : 행동중인 봄 - Craig Walls

  5. ==============================

    5.JPA 스펙은 두 가지를 정의합니다. 엔티티 관리자의 종류 :

    JPA 스펙은 두 가지를 정의합니다. 엔티티 관리자의 종류 :

    응용 프로그램 관리 EntityManagers는 PersistenceProvider의 createEntityManagerFactory () 메소드를 호출하여 얻은 EntityManagerFactory에 의해 작성됩니다. 한편 컨테이너 관리 EntityManagerFactory는 PersistenceProvider의 createContainerEntityManagerfactory () 메소드를 통해 가져옵니다.

    엔티티 관리자 팩토리의 각 특성은 해당 Spring factory bean에 의해 생성됩니다.

    응용 프로그램에서 관리되는 선택 사항 EntityManagerFactory와 컨테이너 관리 EntityManagerFactory는 Spring 기반 애플리케이션에 완전히 투명합니다. 스프링과 JPA로 작업 할 때 EntityManagerFactory의 두 가지 형식을 다루는 복잡한 세부 사항은 숨겨져 있으며 데이터 액세스 코드는 실제 목적 (데이터 액세스)에 초점을 맞춘 채로 남습니다.

    Spring과 관련하여 애플리케이션 관리 컨테이너와 컨테이너 관리 엔티티 관리자 팩토리 사이의 진정한 차이점은 Spring 애플리케이션 컨텍스트에서 각각 어떻게 구성되어 있는지에 있습니다.

  6. ==============================

    6.LocalEntityManagerFactoryBean은 PersistenceProvider.createEntityManagerFactory ()를 통해 EntityManagerFactory를 생성합니다.

    LocalEntityManagerFactoryBean은 PersistenceProvider.createEntityManagerFactory ()를 통해 EntityManagerFactory를 생성합니다.

    LocalContainerEntityManagerFactoryBean은 PersistenceProvider.createContainterEntityManagerFactory ()를 통해 EntityManagerFactory를 생성합니다.

  7. ==============================

    7.둘 다 default로 resource_local을 사용하면 LocalContainerEntityManagerFactoryBean이 컨테이너 관리 트랜잭션을 사용하고 다른 하나가 응용 프로그램 관리 트랜잭션을 사용한다는 엄지 법칙을 적용하지 않습니다.

    둘 다 default로 resource_local을 사용하면 LocalContainerEntityManagerFactoryBean이 컨테이너 관리 트랜잭션을 사용하고 다른 하나가 응용 프로그램 관리 트랜잭션을 사용한다는 엄지 법칙을 적용하지 않습니다.

    의존성 주입 컨테이너 외부에서 JPA를 사용하는 경우 트랜잭션은 개발자가 프로그래밍 방식으로 처리해야합니다. Spring 종속성 주입 컨테이너 내부에서 JPA를 사용하는 경우 Spring 컨테이너로 처리 할 수 ​​있습니다.

    LocalContainerEntityManagerFactoryBean을 사용하는 예제

    public class DataConfig {
        @Bean
        LocalContainerEntityManagerFactoryBean entityManagerFactory() {
            //LocalEntityManagerFactoryBean lfb = new LocalEntityManagerFactoryBean();
            LocalContainerEntityManagerFactoryBean lfb = new LocalContainerEntityManagerFactoryBean();
            lfb.setDataSource(dataSource());
            lfb.setPersistenceUnitName("localEntity");
            lfb.setPersistenceProviderClass(HibernatePersistence.class);
            lfb.setPackagesToScan("com.javasampleapproach.h2database.model");
            lfb.setJpaProperties(hibernateProps());
            return lfb;
        }
    }
    @Component
    public class PostRepository {
      @Autowired
        EntityManagerFactory emf;
      }
      public void create(){
          EntityManager em = emf.createEntityManager();
          Post post = new Post("First post");
          em.getTransaction().begin();
          em.persist(post);
          em.getTransaction().commit();
      }
    }
    

    LocalEntityManagerFactoryBean의 오류

    java.lang.IllegalStateException : 공유 EntityManager에서 트랜잭션을 생성 할 수 없음 - 대신 Spring 트랜잭션 또는 EJB CMT 사용

    public class DataConfig {
        @Bean
        LocalEntityManagerFactoryBean entityManagerFactory() {
            LocalEntityManagerFactoryBean lfb = new LocalEntityManagerFactoryBean();
            lfb.setPersistenceUnitName("localEntity");
            lfb.setPersistenceProviderClass(HibernatePersistence.class);
            lfb.setJpaProperties(hibernateProps());
            return lfb;
        }
    }
    
    @Component
        public class PostRepository {
          @Autowired
          EntityManager em;
    
          public void create(){
              EntityManager em = emf.createEntityManager();
              Post post = new Post("First post");
              em.getTransaction().begin();
              em.persist(post);
              em.getTransaction().commit();
          }
        }
    <persistence-unit name="localEntity">
    </persistence-unit>
    

    LocalEntityManagerFactoryBean을 사용한 작업 코드

    LocalEntityManagerFactoryBean의 경우 container-managed와 같은 Spring 관리 트랜잭션.

    public class DataConfig {
        @Bean
        LocalEntityManagerFactoryBean entityManagerFactory() {
            LocalEntityManagerFactoryBean lfb = new LocalEntityManagerFactoryBean();
            lfb.setPersistenceUnitName("localEntity");
            lfb.setPersistenceProviderClass(HibernatePersistence.class);
            lfb.setJpaProperties(hibernateProps());
            return lfb;
        }
    }
    
    @Component
    public class PostRepository {
      @Autowired
      EntityManagerFactory emf;
    
      @Transactional
      public void create() {
        Post post = new Post("First post");
        em.persist(post);
      }
    }
    
    <persistence-unit name="localEntity">
    </persistence-unit>
    

    컨테이너 관리 트랜잭션에서 두 가지 구현을 모두 사용할 수 있습니다. 수정이 필요한 경우 수정하십시오.

  8. from https://stackoverflow.com/questions/6156832/what-is-the-difference-between-localcontainerentitymanagerfactorybean-and-locale by cc-by-sa and MIT license