Spring Data JPA配置详解

大家好,我是指北君,Spring给我们带来很多效率的提升,特别是数据库持久化这块,以往各种必须写代码和SQL实现的数据库操作现在只需要配置和申明接口就能完成相同的任务,包含一些复杂的SQL语句,当然要使用这种便捷的工具少不了按照JPA的要求进行配置,本篇文章中指北君将详细介绍JPA中最核心的配置。

@EnableJpaRepositories注解用于Srping JPA的代码配置,也是最核心的注解。早期的版本是通过xml形式的配置文件来实现的,但xml配置方式显然不直观也不易维护,因此在后续版本支持了通过注解@EnableJpaRepositories来支持,@EnableJpaRepositories来支持支持很多复杂的配置,下面将为大家详细介绍。

1、简单配置

1
@EnableJpaRepositories("com.spr.repository")

简单配置支持多个package,格式如下:

1
@EnableJpaRepositories({"com.spr.sample.repository", "com.spr.sample2.repository"})

2、单值和多组值配置方式 EnableJpaRepositories的注解中的属性可以都支持单个注解和多个注解,多个属性采用”{}”符号包含的一组数据。 比如: 字符串形式的 “x.y.z” => {“x.y.z”,”a.b.c”} 类别: A.class => {A.class, B.class}

3、完整的@EnableJpaRepositories注解 下面是JPA的完整注解:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
@EnableJpaRepositories(
    basePackages = {},
    basePackageClasses = {},
    includeFilters = {},
    excludeFilters = {},
    repositoryImplementationPostfix = "Impl",
    namedQueriesLocation = "",//META-INF/jpa-named-queries.properties
    queryLookupStrategy=QueryLookupStrategy.Key.CREATE_IF_NOT_FOUND, 
    repositoryFactoryBeanClass=JpaRepositoryFactoryBean.class, 
    entityManagerFactoryRef="entityManagerFactory",
    transactionManagerRef="transactionManager",
    considerNestedRepositories=false, 
    enableDefaultTransactions=true
)

指北君将分别解释各个配置项的作用

1)basePackage 用于配置扫描Repositories所在的package及子package。简单配置中的配置则等同于此项配置值,basePackages可以配置为单个字符串,也可以配置为字符串数组形式。

1
2
@EnableJpaRepositories(
        basePackages = "com.xx")

多个包路径

1
2
@EnableJpaRepositories(
        basePackages = {"com.xx.xx.repository", "com.xx1.xx1.repository"})

2)basePackageClasses 指定 Repository 类

1
2
3
@EnableJpaRepositories(basePackageClasses = BookRepository.class)
@EnableJpaRepositories(
        basePackageClasses = {ShopRepository.class, OrganizationRepository.class})

备注:测试的时候发现,配置包类的一个Repositories类,该包内其他Repositores也会被加载

3)includeFilters 过滤器,该过滤区采用ComponentScan的过滤器类

1
2
@EnableJpaRepositories(
        includeFilters={@ComponentScan.Filter(type=FilterType.ANNOTATION, value=Repository.class)})

4)excludeFilters 不包含过滤器

1
2
3
4
@EnableJpaRepositories(
        excludeFilters={
                @ComponentScan.Filter(type=FilterType.ANNOTATION, value=Service.class),
                @ComponentScan.Filter(type=FilterType.ANNOTATION, value=Controller.class)})

5)repositoryImplementationPostfix 实现类追加的尾部,比如ShopRepository,对应的为ShopRepositoryImpl

6)namedQueriesLocation named SQL存放的位置,默认为META-INF/jpa-named-queries.properties

7)queryLookupStrategy 构建条件查询的策略,包含三种方式CREATE,USE_DECLARED_QUERY,CREATE_IF_NOT_FOUND

CREATE:按照接口名称自动构建查询 USE_DECLARED_QUERY:用户声明查询 CREATE_IF_NOT_FOUND:先搜索用户声明的,不存在则自动构建 该策略针对如下通过接口名称自动生成查询的场景

1
2
3
4
5
6
7
8
9
10
11
12
13
14
  List<Person> findByEmailAddressAndLastname(EmailAddress emailAddress, String lastname);

  // Enables the distinct flag for the query
  List<Person> findDistinctPeopleByLastnameOrFirstname(String lastname, String firstname);
  List<Person> findPeopleDistinctByLastnameOrFirstname(String lastname, String firstname);

  // Enabling ignoring case for an individual property
  List<Person> findByLastnameIgnoreCase(String lastname);
  // Enabling ignoring case for all suitable properties
  List<Person> findByLastnameAndFirstnameAllIgnoreCase(String lastname, String firstname);

  // Enabling static ORDER BY for a query
  List<Person> findByLastnameOrderByFirstnameAsc(String lastname);
  List<Person> findByLastnameOrderByFirstnameDesc(String lastname)

8)repositoryFactoryBeanClass 指定Repository的工厂类

9)entityManagerFactoryRef 实体管理工厂引用名称,对应到@Bean注解对应的方法

1
2
3
4
5
6
7
8
9
10
@Bean
public LocalContainerEntityManagerFactoryBean entityManagerFactory() {
	LocalContainerEntityManagerFactoryBean entityManagerFactoryBean = new LocalContainerEntityManagerFactoryBean();
	entityManagerFactoryBean.setDataSource(dataSource());
	entityManagerFactoryBean.setPersistenceProviderClass(HibernatePersistenceProvider.class);
	entityManagerFactoryBean
		.setPackagesToScan(env.getRequiredProperty(PROPERTY_NAME_ENTITYMANAGER_PACKAGES_TO_SCAN));
	entityManagerFactoryBean.setJpaProperties(hibProperties());
	return entityManagerFactoryBean;
}

10)transactionManagerRef 事务管理工厂引用名称,对应到@Bean注解对应的方法

1
2
3
4
5
6
@Bean
public JpaTransactionManager transactionManager() {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(entityManagerFactory().getObject());
    return transactionManager;
}

总结

以上就是指北君本期介绍的内容,在大家遇到JPA配置问题时可以当帮助手册来查询使用。

我是指北君,操千曲而后晓声,观千剑而后识器。感谢各位人才的:点赞、收藏和评论,我们下期更精彩!

Java Geek Tech wechat
欢迎订阅 Java 技术指北,这里分享关于 Java 的一切。