Protogalaxy

Planet #0

PHSS-Core开发日志#7 Spring Data JPA及Spring data REST配置记录

1.Spring Data JPA

随着开发进度的不断推进,由于对REST服务的需求与对开发速度的需要,加之在设计初期PHSS的整个系统就坚定拥抱了Spring Projects,所以在Service开发开始前的这个节点,我将ORM框架由基本的Hibernate切换到了与Spring的其他各种项目更有亲和性,并且开发更为简便的Spring Data系列,包括Spring data JPA,Spring data REST。

通过观察Spring-boot-starter-data-jpa的依赖图,不难发现它的默认依赖树其实是基于Hibernate的,所以Hibernate的很多特性其实都可以平移至Spring data jpa的项目上。正如Spring Data JPA Reference中所描述的那样,Spring Data JPA实现了对JPA规范的再次向上扩展,旨在通过显著减少数据库访问次数来提高据访问层的性能。

Spring Data JPA的实体类配置和HIbernate差不多,由于同样基于JPA规范,所以PHSS的ORM框架切换工程进行的非常平滑顺畅,由于原来的实体类是严格按照JPA规范配置的,所以并不需要非常复杂的工作,只是进行了以下几方面的修改:

  1. 添加基于Spring boot的spring-data-jpa依赖
  2. 删除项目资源中的Hibernate配置文件,改为使用application.propertiles进行配置
  3. 删除了原本的JPAUtils,改为由Spring自动发现并配置数据源

至此,就算是完成了从Hibernate到Spring Data JPA的框架切换,简单而优雅。

完成了DO层的框架切换后,我便开始使用Spring Data JPA所带来的各种新特性,其中最主要的就是Spring Data Repositorys,这是个非常神奇的特性_(:з)∠)_,它的基本接口-CrudRepository大概就是下面这样:

public interface CrudRepository<T, ID extends Serializable>
  extends Repository<T, ID> {

  <S extends T> S save(S entity);      

  Optional<T> findById(ID primaryKey); 

  Iterable<T> findAll();               

  long count();                        

  void delete(T entity);               

  boolean existsById(ID primaryKey);   

  // … more functionality omitted.
}

可以看到,这个接口包含了所有基本的CRUD操作,它的使用方式也非常简单而神奇,至于要定义一个新的接口来继承这个CrudRepository接口,指定使用的实体类与其主键的类型即可,基本实现形式如下:

interface UserRepository extends CrudRepository<UserEntity, Long> {
}

到此你便实现了UserEntity的基本CRUD操作接口,是的。就是这么简单_(:з)∠)_。

如果想要更多的定制化查询手段的话,可以额外继承另一个叫做Repository的接口,以下是User实体类实现findByName查询方法的过程,只需按照如下方式声明一个新的接口:

interface UserRepository extends Repository<UserEntity, Long> {
  List<UserEntity> findByName();
}

是的,只需定义接口,不需要自己写实现∑( 口 ||。这是因为Spring data使用了一种方法名解析器来按照特定语义解析你在这个接口所定义的各种方法,然后自动完成方法的实现以及bean的注册,在使用时至于要将bean注入,然后调用你定义的接口即可。声明语法可以参考这里

不过在使用Repository特性之前,我们需要先通过JavaConfig来开启这一特性,PHSS的具体实现方式如下

@EnableJpaRepositories("me.protogalaxy.datasource.entity.repository")
public class PhssDatasourceConfig {
}

注解的参数为指定需要扫描的Repositories所在的包。

2.Spring Data REST

在完成了Spring Data JPA的切换与配置后,我又引入了Spring Data REST来简化REST服务的开发,Spring Data REST是基于Speing Data JPA Repositories所实现的一套基于HATEOAS标准的REST服务。在MAVEN环境下使用时,只需引入Spring Data REST的Spring boot POM dependency并且在application.properties中定义api地址即可。Spring Data REST会自动使用之前定义的CrudRepositories来在配置的地址下实现REST服务,不过需要注意的是,API格式是基于HATEOAS标准的,需要前端进行相关的适配,要了解关于HATEOAS的更多信息可以点这里

发表评论