[Day - 10] - 运用FlywayDB自动化整合Spring JPA 的模式注解之旅

Abstract

在一套系统架构中,势必需要运用到资料库的存取概念,开发者势必都会选择一种ORM[Spring JPA、MyBatis或Hibernate]作为资料库事务交易代理媒介,如此便可将所有创建、读取、修改及删除(CRUD)之资料事务交易简单化,亦可防止各种资料库注入式攻击及提升开发效率,在这些物件关联对应(ORM,Object-Relational Mapping )代理套件中,必定都会配置仓储注解(@Reporitory)来表示资料接取物件(DAO,Data Access Object)对象,此模式注解支持所有物件持久化及例外抛出管理,透过此仓储运用概念可提升运作事务交易效能,亦可整合各类模式注解,我们将在下面帮您逐一介绍罗。

Principle Introduction

前章节已提过各类注解可提供开发者进行整合,透过Spring 核心内所提供的@Reporitory的持久层注解,此注解与元注解注册方式相同,亦无注册顺序之分,此注解在切面式编程上多加了几道工法,第一道为资料交易的例外事件进行例外事件分析与处理,这样有什麽好处呢?就是不需要在DAO层加上try.....catch判断,运用在每个代理对象添加一个PersistenceExceptionTranslationAdvisor元件,会将相关事务的交易例外事件处理成Spring框架异常,正是为了所有事物交易的持久化处理进而提升交易效率,以下范例我们采用Spring JPA来进行Postgresql事务交易,以下我们提供此范例进行介绍。

以下范例我们特别配制了一个注解(PostgresqlRepository),来特别注明DAO交易媒介。

@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Repository
public @interface PostgresqlRepository {
    @AliasFor(annotation = Repository.class)
    String value() default "";
}

透过此注解来标明继承Spring JPA的介面,予以额外分析事务交易例外事件,以提升效能。


@PostgresqlRepository
public interface DancingTableRepository extends JpaRepository<DanceRank, Integer> {
    DanceRank findByName(String name);

    List<DanceRank> findAll();
}

并将此Bean注册於Service中,透过Contructor自动注入仓储元件(@Repository),这样亦可提供给Controller或相关服务进行触发注入,达到个服务介接或达到服务导向架构(Service-Oriented Architecture,SOA) 开发。

@TransactionalService
public class DancingRankServiceImpl implements DancingRankService{
    private final DancingTableRepository repository;

    @Autowired
    public DancingRankServiceImpl(DancingTableRepository repository) {
        this.repository = repository;
    }

    ...
    public DanceRank getDanceRank(String name) {
        return this.repository.findByName(name);
    }

    .....
}

透过以上程序码我们可以看出开发者更进一步朝向网域驱动设计(Domain Driven Design,DDD)发展,透过此架构我们采用Flywaydb进行自动扫瞄检查并产生新资料表,提供开发者减少产生表的步骤,透过范例可以快速达到运用与测试。

Structure

在此架构中,可以看到服务一启动会自动触发flywaydb套件进行自动检所及建立新资料表,并在将所有相关的元件(Component)自动汇入BeanFactory,由架构中可看出我们采用叫简单化的Spring JPA物件关联对应套件(ORM,Object Relational Mapping)进行事务仓储交易,透过此套件我们可确切定义好服务与仓储介面的事件触发管理,确切保障所有资料的正确性及一致性。

image
图一 仓储交易架构图

Sample Source

day-10-spring-repository-sample

Sample Boot follow up

跳转至范例目录中的“docker-compose”,并进行建立postgresql资料库容器,输入下面指令

docker-compose -f docker-compose.yml up -d

当您自动触发测试范例或启动专案时,专案会自动进行会建立dancing_table资料表及产生一笔测试资料。
Run test task

gradle test

Run open result html

open ./build/reports/tests/test/classes/sw.spring.sample.DancingRankTestSuite.html

Test Report

Verify Spring JPA CRUD Action Report
image

Mind-blowing Spring JPA via Repository test detail
image

Reference Url

Spring Boot学习笔记(三)Repository的使用

终於弄懂了Spring@Component @Repository@Service的区别

Spring Boot 自动配置 : PersistenceExceptionTranslationAutoConfiguration


<<:  Ruby on Rails 局部渲染(Partial Render)

>>:  Day10 - [丰收款] 安全无虞後,开始建立订单:ATM虚拟帐号篇 (2)

[Day 23] props

这篇学的有点久,一直搞不懂他的概念是怎样,经过我一番的努力,终於把他搞懂了!!希望大家看完我这篇也可...

[DAY 20] _前20天的结语(落摔判断流程)

从一开使的开发板的教学,再来开发环境的建置,一开始先从最底层的概念讲起以直接操作暂存器讲起,再来以标...

Sass 连接词(&)基础介绍 DAY32

在介绍今天的内容之前 推荐一个不错的东西 那就是 CodePen啦 https://codepen....

Day 12 Flask 基本设定

开始专案前需要先对 Flask 设定一下,让它能够开发的更顺手(又是一段超短的开头)。 基本设定 刚...

Day8 PHP

PHP诞生於1995年,专门为了拿来开发动态网页的开源语言,使用者(Client)透过 HTML 或...