スプリングガイドからJPA処理データベースへ(05)

3253 ワード

05.JPA監査による自動生成時間/修正時間

  • 標準シンボルは、データの作成時間および変更時間(これはメンテナンスの重要な情報であるため)
  • を含む.
  • であるため、データベースを挿入するたびに、更新前に日付データを登録/変更するコードが
  • に至る.
    //생성일 추가 코드 예제
    public void savePosts(){
    	...
        posts.setCreateDate(new LocalDate());
        postsRepository.save(posts);
        ...
    }
    =>JPAレビューを使用して、このような単純で重複したコードを記述する必要がある問題を解決します.

    5-1)LocalDateの使用


    Java 8から、日付タイプとしてLocalDateとLocalDateTimeを使用

    1.ドメインパッケージにBaseTimeEntityクラスを作成する


    すべてのエンティティの親として、エンティティのcreatedDate、modifiedDateの役割を自動的に管理します.
    import lombok.Getter;
    import org.springframework.data.annotation.CreatedDate;
    import org.springframework.data.annotation.LastModifiedDate;
    import org.springframework.data.jpa.domain.support.AuditingEntityListener;
    
    import javax.persistence.EntityListeners;
    import javax.persistence.MappedSuperclass;
    import java.time.LocalDateTime;
    
    @Getter
    @MappedSuperclass // 1.
    @EntityListeners(AuditingEntityListener.class) // 2.
    public class BaseTimeEntity {
    
        @CreatedDate// 3.
        private LocalDateTime createDate;
    
        @LastModifiedDate // 4.
        private LocalDateTime modifieDate;
    }

    1. @MappedSuperclass

  • JPA EntityクラスはBaseTimeEntityを継承します.
  • (作成日、変更日)

    2. @EntityListeners(AuditingEntityListener.class)

  • BaseTimeEntityクラスには、監査機能
  • が含まれています.

    3. @CreatedDate

  • エンティティの作成と保存時の自動保存時間
  • 4. @LastModifiedDate


    クエリ
  • のEntity値を変更した場合の自動保存時間
  • 2.PostsクラスをBaseTimeEntityの継承に変更



    3.アプリケーションクラスにアクティブな宣言を追加


    @EnableJpaAuditingを追加し、すべてのJPA Auditingを有効にします.
    /*이 프로젝트의 메인 클래스*/
    @EnableJpaAuditing //JPA Auditing 활성화
    @SpringBootApplication //스프링부트의 자동설정, 스프링 Bean 읽기와 생성 모두 자동 설정
    public class Application {
        public static void main(String[] args){
            //SpringApplication.run ~> 내장 WAS 실행
            SpringApplication.run(Application.class, args);
        }
    }

    5-2)JPA監査試験コードの作成


    1.試験方法をPostsRepositoryTestクラスに追加する

    @Test
        public void BaseTimeEntity_등록(){
            //given
            LocalDateTime now = LocalDateTime.of(2019,6,4,0,0,0);
            postsRepository.save(Posts.builder()
                    .title("title")
                    .content("content")
                    .author("author")
                    .build());
    
            //when
            List<Posts> postsList = postsRepository.findAll();
    
            //then
            Posts posts = postsList.get(0);
    
            System.out.println(">>>>>>>> createDate=" + posts.getCreateDate()
                + ", modifiedDate=" + posts.getModifieDate());
            assertThat(posts.getCreateDate()).isAfter(now);
            assertThat(posts.getModifieDate()).isAfter(now);
        }

    2.テストコードの実行



    実際の時間がよく保存されていることがわかります.登録日/変更日を考慮せずに、BaseTimeEntityを継承するだけです.