2.JPAの起動


第二章。JPAの起動


プロジェクトの設定


本の中ではクリップで行いますが、敷きにくいのでIntelliJで行います.

IntelliJでMavenプロジェクトを作成する



H 2データベースのインストール


1.4.198以降は、セキュリティ上の問題でデータベースが自動的に生成されないため、直接データベースを作成する必要があります.brew install h2 h2

  • Embeddedモードで接続テストを行うと、Serverモードで動作します.(ダメならなるべく開けてみます)


  • サンプル・テーブルの作成

  • ライブラリとプロジェクト構造

  • Maven
    Java用のプロジェクト管理ツール管理ツール(ライブラリ管理機能と構築機能を含む)
  • pom.xml
    これはMavenのプロファイルです.
  • <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>org.example</groupId>
        <artifactId>JPA_STUDY</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <properties>
            <maven.compiler.source>8</maven.compiler.source>
            <maven.compiler.target>8</maven.compiler.target>
        </properties>
    
        <dependencies>
            <!-- https://mvnrepository.com/artifact/org.hibernate/hibernate-entitymanager -->
            <dependency>
                <groupId>org.hibernate</groupId>
                <artifactId>hibernate-entitymanager</artifactId>
                <version>5.6.5.Final</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
            <dependency>
                <groupId>com.h2database</groupId>
                <artifactId>h2</artifactId>
                <version>2.1.210</version>
            </dependency>
        </dependencies>
    </project>

    オブジェクトマッピングの開始

    package jpabook.start;
    
    import javax.persistence.Column;
    import javax.persistence.Entity;
    import javax.persistence.Id;
    import javax.persistence.Table;
    
    @Entity
    @Table(name = "MEMBER")
    public class Member {
    
        @Id
        @Column(name = "ID")
        private String id;
        @Column(name = "NAME")
        private String username;
        // 매핑 정보가 없는 필드
        private Integer age;
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getUsername() {
            return username;
        }
    
        public void setUsername(String username) {
            this.username = username;
        }
    
        public Integer getAge() {
            return age;
        }
    
        public void setAge(Integer age) {
            this.age = age;
        }
    }
  • @EntityJPAにクラスをテーブルにマッピングするように伝えます.エンティティークラス
  • と呼ぶ
  • @Tableエンティティ・クラスにマッピングするテーブル情報を通知します.name属性でメンバーエンティティをMEMBERテーブルにマッピングし、省略するとクラス名をテーブル名にマッピングします.
  • @IdPirmary Key(デフォルトキー)をマップします.@Idを使用するフィールドを識別子フィールドと呼びます.
  • @Columnフィールドをカラムにマップします.nameプロパティを使用して、メンバーエンティティのユーザー名フィールドをMEMBERテーブルのNAME列にマッピングします.
  • マッピング情報のないフィールド
    マッピング宣言が省略されている場合は、フィールド名を使用してカラム名にマッピングします.データベースが大文字と小文字を区別する場合は、nameプロパティに明示的にマッピングする必要があります.
  • persistence.xml設定

  • JPA堅持.xmlを使用して、必要な設定情報を管理します./META-INF/persistence.xmlクラスパスの場合、JPAは設定を必要とせずに認識できます.
  • <?xml version="1.0" encoding="UTF-8"?>
    <persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" version="2.1">
        <persistence-unit name="jpabook">
            <properties>
                <!-- 필수 속성 -->
                <property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
                <property name="javax.persistence.jdbc.user" value="sa"/>
                <property name="javax.persistence.jdbc.password" value=""/>
                <property name="javax.persistence.jdbc.url" value="jdbc:h2:tcp://localhost/~/test"/>
                <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />
    
                <!-- 옵션 -->
                <property name="hibernate.show_sql" value="true" />
                <property name="hibernate.format_sql" value="true" />
                <property name="hibernate.use_sql_comments" value="true" />
                <property name="hibernate.id.new_generator_mappings" value="true" />
                <property name="hibernate.hbm2ddl.auto" value="create"/>
    
                <!--<property name="hibernate.hbm2ddl.auto" value="create" />-->
            </properties>
        </persistence-unit>
    </persistence>
  • <persistence-unit name="jpabook">JPAは、永続ユニットから始まり、通常、接続するデータベースごとに永続ユニットを登録します.name属性は、固有の名前を付与します.
  • <property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect" />データベースの方言の設定
    データベースの方言とは?
    SQL標準または特定のデータベース固有の機能を遵守していません.Hibernateを含むほとんどのJPAインプリメンテーションでは、特定のデータベースに依存しないように、異なるデータベース方言クラスが提供されています.
  • アプリケーション開発

    package jpabook.start;
    
    import java.util.List;
    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.EntityTransaction;
    import javax.persistence.Persistence;
    
    public class JpaMain {
    
        public static void main(String[] args) {
            // 엔티티 매니저 팩토리 생성
            EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");
            // 엔티티 매니저 생성
            EntityManager em = emf.createEntityManager();
            // 트랜잭션 획득
            EntityTransaction tx = em.getTransaction();
    
            try {
                tx.begin();             // 트랜잭션 시작
                logic(em);              // 비지니스 로직 실행
                tx.commit();            // 트랜잭션 커밋
            } catch (Exception e) {
                tx.rollback();          // 트랜잭션 롤백
            } finally {
                em.close();             // 엔티티 매니저 종료
            }
            emf.close();                // 엔티티 매니저 팩토리 종료
        }
    
        public static void logic(EntityManager em) {
    		
            String id = "id1";
            Member member = new Member();
            member.setId(id);
            member.setUsername("지한");
            member.setAge(2);
    
            //등록
            em.persist(member);
    
            //수정
            member.setAge(20);
    
            //한 건 조회
            Member findMember = em.find(Member.class, id);
            System.out.println("findMember=" + findMember.getUsername() + ", age=" + findMember.getAge());
    
            //목록 조회
            List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList();
            System.out.println("members.size=" + members.size());
    
            //삭제
            em.remove(member);
        }
    }

    エンティティマネージャの設定


  • EntityManagerFactoryの作成
    persistence.xmlの設定情報を使用してEntityManagerFactoryを作成します.EntityManagerFactory emf = Persistence.createEntityManagerFactory("jpabook");からMETA-INF/persistenceへ.xmlでjpabookという名前の永続性ユニットを検索し、EntityManagerFactoryを作成します.これは、JPAを駆動するベースオブジェクトを作成し、インプリメンテーションに基づいてデータベース接続プールを作成するため、非常に高価な作成方法です.したがって、EntityManagerFactoryは、アプリケーションに基づいて作成および共有するだけです.

  • Entity Managerの作成EntityManager em = emf.createEntityManager(); EntityManagerを生成します.JPAの機能の大部分はEntityManagerから提供され(登録、修正、削除、照会など)、内部でデータソース(データベース接続)とデータベースとの通信を維持します.Entity Managerはデータベース接続と密接に関連しているため、スレッド間で共有または再利用する必要はありません.

  • の最後の部分
    使用済みのEntityManagerとEntityManagerFactoryは、次のように終了します.
  • em.close();		// 엔티티 매니저 종료
    emf.close();	// 엔티티 매니저 팩토리 종료

    トランザクション管理

  • JPAを使用する場合は、常にトランザクション内でデータを変更する必要があります.トランザクションAPIはEntityTransaction tx = em.getTransaction();のように受信され、通常の動作時にコミットされ、異常発生時にロールバックされる.
  • ビジネスロジック

  • 登録
  • String id = "id1";
    Member member = new Member();
    member.setId(id);
    member.setUsername("지한");
    member.setAge(2);
    
    em.persist(member);

    メンバーエンティティを作成し、em.persist(member)を実行すると、JPAはマッピング情報を分析し、上のSQLを生成してSQLに渡します.
  • 修正
  • member.setAge(20);
    JPAにはトレース値の寄付があるので、値をsetterに変更すればUPDATE SQLを生成し、値をデータのbesに変更できます.
    削除
  • em.remove(20);

    remove()メソッドを使用する場合、JPAはDELETE SQLを生成して実行します.
    照会
  • Member findMember = em.find(Member.class, id);
    find()メソッドは、クエリーするエンティティタイプと@Idを使用してエンティティをクエリーできます.その後、クエリーの結果に基づいてエンティティを生成し、返します.

    JPQL

  • JPAはオブジェクトを中心に開発されているため、検索を行う際にもテーブルではなくエンティティオブジェクトに対して検索を行う必要があります.
  • エンティティを検索するには、すべてのデータをエンティティに変更してから検索する必要があります.これはでたらめです.
  • クエリ言語
  • JPQL(Java Persistence Query Language)を使用して解決します.
    JPQLは、エンティティオブジェクト(クラスおよびフィールド)についてクエリーを行います.
  •  List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList();
  • ここでのメンバーは、MEMBERテーブルではなく、メンバーオブジェクトを指します.
  • 詳細については、10章を参照してください.

    Reference

  • Java ORM標準JPAプログラミング(金英漢)