TIL-JAVA Spring DAY 16(JPA実施完了)


JPAを実施する前に環境整備作業を行っている.次はドメインに触ってみましょう.domainpackageでMember.javaクラスを開き、次のように変更します.Member.java
package hello.hellospring.domain;

import javax.persistence.*;

@Entity // 1.
public class Member {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY) // 2.
    private Long id;

    private String name;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}
  • @Entity注記を貼れば、これからJPA管理の対象となります.
  • @Id , @GeneratedValue(strategy = GenerationType.IDENTITY)PK(primary key)を表すために@Idが貼られています.
    PKはDBで値を生成します.
    ただし、以前にDBにinsert文を作成した場合(insert into member(name)values(「spring 1」)自動割付IDがh 2コンソールで見られた.このように、データベースに値を入力すると、データベースが自動的に生成するポリシーはIDENTITYポリシーと呼ばれ、@GenerateValueはこれを表します.
  • 上記の注釈をDBにマッピングすることで、この情報に基づいてInsert、Select、Delete文などのSQL文をJPAが自動的に記述することができます.
    次に、JPAベースの動的レポートを作成します.JpaMemberRepository.class
    package hello.hellospring.repository;
    
    import hello.hellospring.domain.Member;
    
    import javax.persistence.EntityManager;
    import java.util.List;
    import java.util.Optional;
    
    public class JpaMemberRepository implements MemberRepository{
    
        private final EntityManager em;		// 1.
    
        public JpaMemberRepository(EntityManager em) {
            this.em = em;
        }
    
        @Override	
        public Member save(Member member) {	
            em.persist(member);				// 2.
            return member;
        }
    
        @Override
        public Optional<Member> findById(Long id) {
            Member member = em.find(Member.class, id);   // 3.
            return Optional.ofNullable(member);		
        }
    
        @Override
        public Optional<Member> findByName(String name) {
            List<Member> result = em.createQuery("select m from Member m where m.name = :name", Member.class)						// 4.
                    .setParameter("name", name)
                    .getResultList();
    
            return result.stream().findAny();
        }
    
        @Override
        public List<Member> findAll() {
            List<Member> result = em.createQuery("select m from Member m", Member.class)
                    .getResultList();
            return result;
        }
    }

  • JPAの動作方式はEntityManagerである.そこで、これを基に、作成者も作成しました.私たちは以前gradleで'org.springframework.boot:spring-boot-starter-data-jpa'を実現しました.これによりspringbootはEntityManagerを自動的に生成します.注射を受けさえすればいいです.

  • これにより、JPAは、Insert queryを作成し、DB、member、setIdに保存する.

  • idを使用して検索するfindByIdメソッドでは、em.findを使用してパラメータ値としてクエリーするタイプとPK値を入力するだけでよい.△値段がないかもしれないので、かばうことにした.
  • findByNameという名前のメソッドは、通常SQLをテーブルオブジェクトとして使用しますが、オブジェクトに対するクエリーを使用する特殊なオブジェクト向けクエリー言語、すなわちJpqlを使用する必要があります.
    一般的に、SQL文の作成方法は"select * from Member""select m.Id Member"と同じです.
    また、マッピングも必要です.しかしJpqlを用いて記述すると,"select m from Member m"のようにMember Entity自体が選択されていることがわかる.地図も描きました.

  • 第4の形態で実施
  • 最後に、JPAを使用するには、データの格納と変更に注意することが多いため、トランザクションは動作しなければなりません.したがって、MemberService.classには、以下の注釈が追加される.
    @Transactional
    public class MemberService {
    
        private final MemberRepository memberRepository;
    
        public MemberService(MemberRepository memberRepository) {
            this.memberRepository = memberRepository;
        }

    Config...


    ついに最後に...組立段階.
    Service PackageのSpring config.classを表示します.
    private DataSource dataSource;
    
    	@AutoWired
        public SpringConfig(DataSource dataSource) { 
        	this.dataSource = dataSource; 
        }
    前述したように、dataSourceで以前に受信したコンテンツは削除され、EntitiyManagerで受信したコンテンツは以下のように記述される.
    private EntityManager em;
    
        @Autowired
        public SpringConfig(EntityManager em) {
            this.em = em;
        }
    その後、memberRepository()メソッドにJpaMemberRepository(em)を追加し、以下に示すようにする.
        @Bean
        public MemberRepository memberRepository() {
            return new JpaMemberRepository(em);
        }

    (MemberRepositoryの歴史…)
    これは期待される総合テスト時間です.一体…?

    成功!テスト結果をよく見て...

    上述したように、hibernateインプリメンテーションがselectおよびinsert queryを解放していることがわかる.
    こうしてJPAの勉強は終わりました技術の進歩の様式は私にいかなる啓示をもたらした.誰もが純粋で当たり前のオリジナルJDBCコードでDBと共同開発していると、気分が悪くなる人もいるかもしれません.また,このような不便に基づいてspringJdbc Templateが再誕生する可能性がある.JPAフレームワークもこのようなニーズに基づいて生まれた.
    何でも、開発時に不快感を覚えるのは新発明の始まりであり、常に不快感を感じる3つの考え方とその態度を改善しようと努力することが重要であることを認識する.