Spring Boot对JPA的自动配置

一 点睛

Spring Boot对JPA的自动配置放置在下面路径下:

二 源码分析

1  HibernateJpaAutoConfiguration类分析

//Spring Boot默认JPA的实现者是Hibernate
@Configuration
@ConditionalOnClass({ LocalContainerEntityManagerFactoryBean.class,
        EnableTransactionManagement.class, EntityManager.class })
@Conditional(HibernateEntityManagerCondition.class)
//HibernateJpaAutoConfiguration依赖于DataSourceAutoConfiguration
@AutoConfigureAfter({ DataSourceAutoConfiguration.class })
public class HibernateJpaAutoConfiguration extends JpaBaseConfiguration {
......
}

2 JpaProperties类分析

//配置JPA可以使用spring.jpa为前缀的属性在application.properties中配置
@ConfigurationProperties(prefix = "spring.jpa")
public class JpaProperties {
......
}

3 JpaBaseConfiguration源码分析

@EnableConfigurationProperties(JpaProperties.class)
@Import(DataSourceInitializedPublisher.Registrar.class)
public abstract class JpaBaseConfiguration implements BeanFactoryAware {

    private static final String[] NO_PACKAGES = new String[0];

    private ConfigurableListableBeanFactory beanFactory;

    @Autowired
    private DataSource dataSource;

    @Autowired(required = false)
    private PersistenceUnitManager persistenceUnitManager;

    @Autowired
    private JpaProperties jpaProperties;

    @Autowired(required = false)
    private JtaTransactionManager jtaTransactionManager;

    //配置了JpaTransactionManager Bean
    @Bean
    @ConditionalOnMissingBean(PlatformTransactionManager.class)
    public PlatformTransactionManager transactionManager() {
        return new JpaTransactionManager();
    }

    //配置了JpaVendorAdapter Bean
    @Bean
    @ConditionalOnMissingBean
    public JpaVendorAdapter jpaVendorAdapter() {
        AbstractJpaVendorAdapter adapter = createJpaVendorAdapter();
        adapter.setShowSql(this.jpaProperties.isShowSql());
        adapter.setDatabase(this.jpaProperties.getDatabase());
        adapter.setDatabasePlatform(this.jpaProperties.getDatabasePlatform());
        adapter.setGenerateDdl(this.jpaProperties.isGenerateDdl());
        return adapter;
    }

    //配置了EntityManagerFactoryBuilder Bean
    @Bean
    @ConditionalOnMissingBean
    public EntityManagerFactoryBuilder entityManagerFactoryBuilder(
            JpaVendorAdapter jpaVendorAdapter) {
        EntityManagerFactoryBuilder builder = new EntityManagerFactoryBuilder(
                jpaVendorAdapter, this.jpaProperties.getProperties(),
                this.persistenceUnitManager);
        builder.setCallback(getVendorCallback());
        return builder;
    }

    @Bean
    @Primary
    @ConditionalOnMissingBean({ LocalContainerEntityManagerFactoryBean.class,
            EntityManagerFactory.class })
    public LocalContainerEntityManagerFactoryBean entityManagerFactory(
            EntityManagerFactoryBuilder factoryBuilder) {
        Map<String, Object> vendorProperties = getVendorProperties();
        customizeVendorProperties(vendorProperties);
        return factoryBuilder.dataSource(this.dataSource).packages(getPackagesToScan())
                .properties(vendorProperties).jta(isJta()).build();
    }

    protected abstract AbstractJpaVendorAdapter createJpaVendorAdapter();

    protected abstract Map<String, Object> getVendorProperties();

    protected void customizeVendorProperties(Map<String, Object> vendorProperties) {
    }

    protected EntityManagerFactoryBuilder.EntityManagerFactoryBeanCallback getVendorCallback() {
        return null;
    }

    //自动扫描注解有@Entity的实体类
    protected String[] getPackagesToScan() {
        if (AutoConfigurationPackages.has(this.beanFactory)) {
            List<String> basePackages = AutoConfigurationPackages.get(this.beanFactory);
            return basePackages.toArray(new String[basePackages.size()]);
        }
        return NO_PACKAGES;
    }

    protected JtaTransactionManager getJtaTransactionManager() {
        return this.jtaTransactionManager;
    }

    protected final boolean isJta() {
        return (this.jtaTransactionManager != null);
    }

    @Override
    public void setBeanFactory(BeanFactory beanFactory) throws BeansException {
        this.beanFactory = (ConfigurableListableBeanFactory) beanFactory;
    }

    @Configuration
    @ConditionalOnWebApplication
    @ConditionalOnClass(WebMvcConfigurerAdapter.class)
    @ConditionalOnMissingBean({ OpenEntityManagerInViewInterceptor.class,
            OpenEntityManagerInViewFilter.class })
    @ConditionalOnProperty(prefix = "spring.jpa", name = "open-in-view", havingValue = "true", matchIfMissing = true)
    protected static class JpaWebConfiguration {

        // Defined as a nested config to ensure WebMvcConfigurerAdapter is not read when
        // not on the classpath
        @Configuration
        protected static class JpaWebMvcConfiguration extends WebMvcConfigurerAdapter {

            //自动配置OpenEntityManagerInViewInterceptor这个Bean
            @Bean
            public OpenEntityManagerInViewInterceptor openEntityManagerInViewInterceptor() {
                return new OpenEntityManagerInViewInterceptor();
            }

            @Override
            public void addInterceptors(InterceptorRegistry registry) {
                //将OpenEntityManagerInViewInterceptor这个Bean注册到Spring MVC的拦截器中
                registry.addWebRequestInterceptor(openEntityManagerInViewInterceptor());
            }

        }

    }

}

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spring Boot 中使用 JPA 配置自动维护表结构,需要进行以下步骤: 1. 在 `application.properties` 文件中配置数据源信息: ``` spring.datasource.url=jdbc:mysql://localhost:3306/testdb spring.datasource.username=root spring.datasource.password=123456 ``` 2. 在 `pom.xml` 文件中添加 JPA 和 MySQL 驱动的依赖: ``` <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-jpa</artifactId> </dependency> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> </dependency> ``` 3. 创建实体类,并使用注解描述实体类和字段的属性: ```java @Entity @Table(name = "user") public class User { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; @Column(name = "username") private String username; @Column(name = "password") private String password; // 省略 getter 和 setter 方法 } ``` 4. 创建 JPA Repository 接口,并继承 `JpaRepository` 接口: ```java public interface UserRepository extends JpaRepository<User, Long> { } ``` 5. 在 `application.properties` 文件中添加 JPA 相关的配置: ``` # 自动建表 spring.jpa.hibernate.ddl-auto=create # 显示 SQL 语句 spring.jpa.show-sql=true # 数据库方言 spring.jpa.database-platform=org.hibernate.dialect.MySQL5Dialect ``` 6. 启动应用程序,JPA自动根据实体类和配置文件的信息生成数据库表结构。如果需要更新表结构,可以将 `spring.jpa.hibernate.ddl-auto` 的值改为 `update`。 以上就是使用 Spring BootJPA 配置自动维护表结构的步骤。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值