美文网首页程序员
Spring-boot与jpa

Spring-boot与jpa

作者: Alisallon | 来源:发表于2018-09-30 17:30 被阅读14次

EntityManagerFactoryBuilder

JPA EntityManagerFactory实例的构建器。
允许你通过一个构建器模式创建一个或多个LocalContainerEntityManagerFactoryBean,并做一些常见配置。
该构建器中包含了最常见的配置选项。
你也可以在一个带@Bean注解的definition方法返回之前,通过该构建器中配置更多的选项。

该构造器会在org.springframework.boot.autoconfigure.orm.jpa.JpaBaseConfiguration中被Spring容器创建好:

@Bean
@ConditionalOnMissingBean
@SuppressWarnings("deprecation")
public EntityManagerFactoryBuilder entityManagerFactoryBuilder(JpaVendorAdapter jpaVendorAdapter, ObjectProvider<PersistenceUnitManager> persistenceUnitManager) {
    EntityManagerFactoryBuilder builder = new EntityManagerFactoryBuilder(jpaVendorAdapter, this.properties.getProperties(), persistenceUnitManager.getIfAvailable());
    builder.setCallback(getVendorCallback());
    return builder;
}

使用的时候,只需要注入即可:

// 配置实体管理器工厂类:EntityManagerFactory
@Bean
@Primary
public LocalContainerEntityManagerFactoryBean entityManagerFactory(EntityManagerFactoryBuilder builder) {
    return builder.dataSource(dataSource())
            /*
            这个packagesToScan必须配置,如果不配置,会出现下面的问题:
            java.lang.IllegalArgumentException: No persistence unit with name 'sysPU' found

            参看源码:org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.obtainPersistenceUnitInfo(DefaultPersistenceUnitManager.java:496)中的readPersistenceUnitInfos()方法
            需要配置packagesToScan参数,才能构建一个默认的PersistenceUnit
             */
            .packages("com.system.manage.entity")
            .persistenceUnit("sysPU")
            .build();
}

LocalContainerEntityManagerFactoryBean

这是一个创建符合JPA标准的EntityManagerFactory的org.springframework.beans.factory.FactoryBean。
这是在Spring应用上下文(application context)中创建JPA EntityManagerFactory bean的最好方式。
可以通过依赖注入(使用@PersistenceContext注解)将EntityManagerFactory传递给基于JPA注解的DAOs。
注意:可以通过配置,切换到JNDI查找或切换到LocalEntityManagerFactoryBean definition。

根据通用JPA配置约定,配置设置通常从Class Path的META-INF/persistence.xml配置文件读取,就像LocalEntityManagerFactoryBean一样。
但是,你如果使用LocalContainerEntityManagerFactoryBean的话,配置会更加灵活。你可以覆盖persistence.xml文件的位置,可以指定要使用的JDBC数据源等等。
此外,它允许通过Spring的org.springframework.instrument.classloading.LoadTimeWeaver实现可插拔类,而不是绑定到JVM启动时指定的特殊VM代理。

LocalContainerEntityManagerFactoryBean在内部自己解析persistence.xml文件,并创建相对应的javax.persistence.spi.PersistenceUnitInfo对象(通过进一步合并配置,如JDBC数据源和
org.springframework.instrument.classloading.LoadTimeWeaver),然后传递给选择的JPA Provider(javax.persistence.spi.PersistenceProvider),比如默认的org.hibernate.jpa.HibernatePersistenceProvider。这是一个完全支持标准JPA容器规约的本地JPA容器。

公开的EntityManagerFactory对象实现了下面两种接口:

  • 由PersistenceProvider返回的原生EntityManagerFactory接口
  • 由当前FactoryBean装配的其他附件元数据的EntityManagerFactoryInfo接口

SharedEntityManagerCreator

在org.springframework.orm.jpa包中。
在这个类中,使用反射创建EntityManager的实现类。

public static EntityManager createSharedEntityManager(EntityManagerFactory emf,........)

创建好之后,由org.springframework.orm.jpa.supportPersistenceAnnotationBeanPostProcessor注入到Dao类中。

PersistenceContext

这是一个注解。
表明了EntityManager与相关联的持久性上下文(persistence context)有依赖关系。

public class BaseDao {
    @PersistenceContext
    EntityManager entityManager;
    ......
}

相关文章

网友评论

    本文标题:Spring-boot与jpa

    本文链接:https://www.haomeiwen.com/subject/fiywoftx.html