programing

Local Container Entity Manager Factory Bean과 Local Entity Manager Factory Bean의 차이점은 무엇입니까?

css3 2023. 8. 18. 22:48

Local Container Entity Manager Factory Bean과 Local Entity Manager Factory Bean의 차이점은 무엇입니까?

스프링 프레임워크의 Local Container Entity Manager Factory Bean과 Local Entity Manager Factory Bean의 차이점을 설명할 수 있는 사람?

기본적으로 JPA 규격은 두 가지 유형의 엔티티 관리자를 정의합니다.다음과 같습니다.

응용프로그램 관리: 응용프로그램 관리 엔티티 관리자는 "엔티티 관리자는 응용프로그램(즉, 당사 코드)에 의해 생성 및 관리됩니다."라는 의미합니다.

ii) 컨테이너 관리: 컨테이너 관리 엔티티 관리자는 "엔티티 관리자는 J2EE 컨테이너에 의해 생성 및 관리됩니다. 즉, 엔티티 관리자는 컨테이너에 의해 직접 생성 및 관리되지 않으며, 코드는 JNDI를 사용하는 것과 같은 방법으로 EM을 받습니다.

주: 생성 및 관리(위)는 "오픈, 클로징 및 거래에 엔티티 관리자 참여"를 의미합니다.

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

참고: 스프링 기반 애플리케이션의 경우 차이가 크지 않습니다.Spring은 역할만 수행합니다(LocalContainerEntityManagerFactoryBean을 구성하는 경우 컨테이너로, LocalEntityManagerFactoryBean을 구성하는 경우 애플리케이션으로).

설명서에는 다음과 같은 내용이 모두 나와 있습니다.

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

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

입니다.EntityManagerFactory.

로컬 엔터티 관리자 팩토리 빈

가장 단순하고 가장 제한적입니다.기존 JDBC 데이터 원본 정의를 참조할 수 없으며 글로벌 트랜잭션을 지원하지 않습니다.

로컬 컨테이너 엔티티 관리자 팩토리 빈

는 가장 강력한 JPA 설정 옵션으로, 애플리케이션 내에서 유연한 로컬 구성이 가능합니다.기존 JDBC 데이터 소스에 대한 링크를 지원하고 로컬 트랜잭션과 글로벌 트랜잭션을 모두 지원합니다.

참조: 스프링-프레임워크-참조.pdf "스프링 3"

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

LocalContainerEntityManagerFactoryBean은 컨테이너 관리 EntityManagerFactory를 생성합니다.

참조: 스프링 작동 중 - 크레이그 월스

  • LocalEntityManagerFactoryBean 및 LocalContainerEntityManagerFactoryBean 구현 모두 org.hibernate.jpa.boot.internal에서 EntityManagerFactory참조를 반환합니다.EntityManagerFactoryBuilderImp.
  • Spring에 JTA 사용을 명시적으로 요청하지 않는 한 각 구현은 resource_local 트랜잭션을 사용합니다.
  • 두 구현 간의 주요 차이점은 LocalContainerEntityManagerFactoryBean이 프로그래밍 방식으로 설정하는 지속성 장치(데이터 소스 및 패키지 ToScan)를 제공한다는 점이며, 지속성의 위치를 재정의할 수 있다는 점에서 더욱 유연합니다.사전 정의된 이름 지속성을 사용해야 하는 LocalEntityManagerFactoryBean과 xml 파일 비교.xml

둘 다 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.java잘못된 상태 예외:공유 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의 경우 컨테이너 관리와 같은 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>

두 구현 모두 컨테이너 관리 트랜잭션에서 사용할 수 있습니다. 수정이 필요하면 수정 부탁드립니다.

봄 프로젝트에서 JPA를 사용하려면 Entity Manager를 설정해야 합니다.

이것은 구성의 주요 부분이며, 우리는 스프링 팩토리 빈을 통해 이 작업을 수행할 수 있습니다.이는 단순한 LocalEntityManagerFactoryBean 또는 보다 유연한 LocalContainerEntityManagerFactoryBean이 될 수 있습니다.

baeldung.com/the-persistence-layer-with-spring-and-jpa

LocalEntityManagerFactoryBean은 지속성Provider.createEntityManagerFactory()를 통해 EntityManagerFactory를 생성합니다.

LocalContainerEntityManagerFactoryBean은 지속성 공급자를 통해 EntityManagerFactory를 생성합니다.createContainerEntityManagerFactory()

언급URL : https://stackoverflow.com/questions/6156832/what-is-the-difference-between-localcontainerentitymanagerfactorybean-and-locale