是什么LocalContainerEntityManagerFactoryBean和LocalEntityManagerFactoryBean负责区别?

问题描述 投票:37回答:7

任何人都可以解释什么是Spring框架的LocalContainerEntityManagerFactoryBean和LocalEntityManagerFactoryBean负责区别?

spring hibernate jpa entitymanager spring-orm
7个回答
37
投票

基本上JPA规范定义了两种类型的实体管理的。他们是 : 我)应用程序管理:应用管理的实体管理的意思是“实体管理器仅通过将应用程序创建和管理(即我们的代码)”。

II)容器管理:容器管理的实体管理的意思是“实体管理器创建和管理由单纯的J2EE容器(即我们的代码不直接管理,而不是实体管理器创建和容器管理,我们的代码被EM是通过某种方式像使用JNDI)。

注:创建和管理(以上)的意思是“开,关,在交易涉及的实体管理器”

LocalContainerEntityManagerFactoryBean - 容器管理 LocalEntityManagerFactoryBean负责 - 应用管理

一个大注:对于基于Spring应用程序,所不同的是并不多。只有春(如果配置LocalContainerEntityManagerFactoryBean和应用程序,如果您配置LocalEntityManagerFactoryBean负责为容器)中扮演的角色


16
投票

该文件说,这一切:

LocalContainerEntityManagerFactoryBean - 从链接:FactoryBean的,根据JPA的标准集装箱引导合约创建JPA EntityManagerFactory的。

LocalEntityManagerFactoryBean - 从链接:FactoryBean的,根据JPA的标准独立引导合约创建JPA EntityManagerFactory的。

从本质上讲,唯一不同的是他们是如何创建JPA EntityManagerFactory


16
投票

LocalEntityManagerFactoryBean负责

是最简单和最有限的。你不能引用现有的JDBC DataSource的bean定义,并为全球交易不存在支持。

LocalContainerEntityManagerFactoryBean

是最强大的JPA设置选项,允许在应用程序内灵活的本地配置。它支持链接到现有的JDBC DataSource,支持本地和全局事务

REF:弹簧框架,参考.pdf“春3”


10
投票

LocalEntityManagerFactoryBean负责产生一个应用程序管理的EntityManagerFactory的。

LocalContainerEntityManagerFactoryBean产生容器管理的EntityManagerFactory。

参考:春天在行动 - 克雷格·沃尔斯


5
投票

JPA规范定义了两种类型的实体管理器:

  • 当应用程序直接请求一个从实体管理器工厂创建应用程序管理的实体管理器。随着应用程序管理的实体管理器,应用程序负责打开或关闭实体管理器和涉及交易的实体管理器。这种类型的实体管理器是最适合在不在Java EE容器中运行的独立应用中使用。
  • 容器管理的实体管理器创建,并通过Java EE容器管理。该应用程序不与实体管理器工厂的所有交互。取而代之的是,实体管理器是通过注射或从JNDI直接获得。容器负责配置实体管理器工厂。这种类型的实体管理器是最适合由想要维持超出了在persistence.xml中指定了JPA配置一些控制在Java EE容器使用。

应用程序管理的EntityManagers由通过调用PersistenceProvider类的EntityManagerFactory方法获得的createEntityManagerFactory()创建。与此同时,容器管理EntityManagerFactorys通过PersistenceProvider类的createContainerEntityManagerfactory()method获得。

实体管理器工厂的每个风味由相应的Spring工厂bean的生产:

  • LocalEntityManagerFactoryBean产生一个应用程序管理的实体 - ManagerFactory。
  • LocalContainerEntityManagerFactoryBean产生容器管理的EntityManagerFactory

它指出,应用程序管理EntityManagerFactory和容器管理EntityManagerFactory之间做出的选择是完全透明的,基于Spring的应用程序是很重要的。当你使用Spring和JPA的工作,处理EntityManagerFactory的两种形式的复杂细节被隐藏起来,让你的数据访问代码集中于它的真实目的:数据访问。

应用程序管理和容器管理的实体管理器工厂之间的唯一真正的区别,就春季来说,是多么的每一个在Spring应用程序上下文配置。


0
投票
  • 这两种实施方式LocalEntityManagerFactoryBean负责和LocalContainerEntityManagerFactoryBean返回从org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl EntityManagerFactory的参考。
  • 每一个实现将使用RESOURCE_LOCAL交易,除非我们明确要求Spring使用JTA。
  • 这两种实现之间的主要区别是提供LocalContainerEntityManagerFactoryBean编程方式设置持久性单元(数据源和packageToScan),更灵活,因为我们可以覆盖persistence.xml文件的位置比较LocalEntityManagerFactoryBean负责在其中我们必须使用预定义的名称的持久性.XML

如果两者都使用RESOURCE_LOCAL为默认值,然后它不是LocalContainerEntityManagerFactoryBean使用容器管理的事务和其他正在使用的应用程序管理的事务经验法则。

当依赖注入容器的外部使用JPA,交易需要由显影剂编程方式处理。如果使用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负责的情况下,像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>

两种实现可以容器管理的事务下使用,请大家指正在此,如果一些修正的需要。


-1
投票

LocalEntityManagerFactoryBean负责创建经由PersistenceProvider.createEntityManagerFactory EntityManagerFactory的()

LocalContainerEntityManagerFactoryBean创建经由PersistenceProvider.createContainterEntityManagerFactory EntityManagerFactory的()

© www.soinside.com 2019 - 2024. All rights reserved.