\study設定-ラベル/地域


JsonProcessingException
JsonProcessingExceptionは、IOExceptionを継承するChecked Exceptionです.そこで、throwsで上級者に伝える方法でも、自分でボールを受け取ってthrowsを投げてみましょう.これは文法上の強制的な選択です.これに対し、Unchecked Exceptionでは明示的な例外処理は不要です.
必要に応じてデータを読み込むだけです.
  • タグと地域情報をAjaxに変更すると、すべての研究(+メンバー、+管理者、+タグ、+地域)情報が
    何で持ってくるの?
  • スプリングデータJPAメソッドを作成し、@Entity Graphと@NamedEntity Graphを使用
  • WithZonesはSpringData JPAにとって意味がなく無害なキーワードなので、クエリはfindByPathと同じですが、他の@EntityGraphを適用できます.
  • 2つのクエリーが発生しました.タグを削除すると、クエリー学習が開始されます.どうしたんですか.学習状況を調べる.タグを削除できるのはインポートのみです.インポート時に学習グループがあるかどうかをチェックし、権限もチェックします.
    findByPathをインポートする場合、つまり学習情報をインポートしてtagを変更する場合は、すべてのデータを以前と同じようにインポートすべきですか?以前使用していたformをクエリーすると、すべてのデータがインポートされます.でもtagを入れて取る時も全部持って帰るんですか?メンバー、マネージャ、ラベルリスト、地域リストなど...->いいえ!😋😋
    優先的に変更する権限があるかどうかを知る必要があります(マネージャが必要かどうか).また、タグ情報を変更する必要があるため、関連関係をインポートする必要があります.そのまま持ってきました.
    StudySettingsController.java
        @PostMapping("/tags/add")
        @ResponseBody
        public ResponseEntity addTag(@CurrentAccount Account account, @PathVariable String path,
                                     @RequestBody TagForm tagForm) {
            Study study = studyService.getStudyToUpdateTag(account, path); 
            Tag tag = tagService.findOrCreateNew(tagForm.getTagTitle()); //findOrCreateNew 중복코드가 생길 수 있기 때문에 코드를 빼준다. 
            studyService.addTag(study, tag);
            return ResponseEntity.ok().build();
        }
    
        @PostMapping("/tags/remove")
        @ResponseBody
        public ResponseEntity removeTag(@CurrentAccount Account account, @PathVariable String path,
                                        @RequestBody TagForm tagForm) {
            Study study = studyService.getStudyToUpdateTag(account, path);
            Tag tag = tagRepository.findByTitle(tagForm.getTagTitle());
            if (tag == null) {
                return ResponseEntity.badRequest().build(); //없는 경우에는 bad request로 응답 보내기 
            }
    
            studyService.removeTag(study, tag);
            return ResponseEntity.ok().build();
        }
    StudyService.java
        // 모든 연관관계를 다 가져온다. 
    public Study getStudyToUpdateTag(Account account, String path) {
            Study study = repository.findAccountWithTagsByPath(path);
            checkIfExistingStudy(path, study);
            checkIfManager(account, study);
            return study;
    }
    getStudyToUpdateTagという新しいサービス方法が作成されました.ここでfindAccountWithTagsByPathという名前のrepositoryメソッドを作成します.
    StudyRepository.java
    package com.yuri.studyolle.study;
    
    import org.springframework.data.jpa.repository.EntityGraph;
    import org.springframework.data.jpa.repository.JpaRepository;
    import org.springframework.transaction.annotation.Transactional;
    
    import com.yuri.studyolle.domain.Study;
    
    @Transactional(readOnly = true)
    public interface StudyRepository extends JpaRepository<Study, Long> {
    
        boolean existsByPath(String path);
    
        // 모든 연관관계를 다 가져온다. 
        @EntityGraph(value = "Study.withAll", type = EntityGraph.EntityGraphType.LOAD)
        Study findByPath(String path);
        
        @EntityGraph(value = "Study.withTagsAndManagers", type = EntityGraph.EntityGraphType.FETCH)
        Study findAccountWithTagsByPath(String path);
    
        @EntityGraph(value = "Study.withZonesAndManagers", type = EntityGraph.EntityGraphType.FETCH)
        Study findAccountWithZonesByPath(String path);
    
    }
    実際、ここでfindAccountWithTagsByPath、WithTagsは無視される.JPA処理のキーワードではありません最終的にfindByPathのようなクエリが発生します.
    これは、同じクエリーに名前を付けるのに異なるメソッドを使用しますが、異なるエンティティを使用します.
    Studioの状態はJPAの観点からどのような状態か
  • AccountServiceと比較します.
  • SettingsController.JAva:プロファイル情報を変更するコントローラ
        @PostMapping(TAGS  + "/add")
        @ResponseBody
        public ResponseEntity addTag(@CurrentAccount Account account, @RequestBody TagForm tagForm) {
        	Tag tag = tagService.findOrCreateNew(tagForm.getTagTitle());
            accountService.addTag(account, tag);
            return ResponseEntity.ok().build();
        }
    ここでaccountオブジェクトは分離状態にあります.永続状態オブジェクトではありません!
    AccountService.java
        public void addTag(Account account, Tag tag) {
            Optional<Account> byId = accountRepository.findById(account.getId());
            byId.ifPresent(a -> a.getTags().add(tag)); // id가 있으면 account에 tag 추가하기 
        }
    
    分離状態にあるオブジェクトがデータを変更して認識できるようにするには、dbからJPAを介してインポートする必要があります.(トランザクションにインポートする必要があります...)
    SettingsSettings Controller.java
        @PostMapping("/tags/add")
        @ResponseBody
        public ResponseEntity addTag(@CurrentAccount Account account, @PathVariable String path,
                                     @RequestBody TagForm tagForm) {
            Study study = studyService.getStudyToUpdateTag(account, path); 
            Tag tag = tagService.findOrCreateNew(tagForm.getTagTitle()); //findOrCreateNew 중복코드가 생길 수 있기 때문에 코드를 빼준다. 
            studyService.addTag(study, tag);
            return ResponseEntity.ok().build();
        }
    では、ここの学習対象はどんな状態ですか.継続状態.永続コンテキストが開きました.開いている場合は、リポジトリからインポートします.
    したがって、サービスではリポジトリStudioを介してクエリーする必要はありません.
    ビュー重複コードの削除
    コードクリップを繰り返します.htmlを入れて置き換えます.
    ⭐ Point ⭐
    クエリーでは、どのクエリーが発生したのか、いつ発生したのか、なぜ発生したのかを把握します.そのクエリーが本当に必要なデータを持ってきたかどうかを判断できるはずです!
    出典:インフラストラクチャ白旗仙のSpringとJPAベースのWebアプリケーション開発
    https://cheese10yun.github.io/checked-exception/