2.JPAの起動
第二章。JPAの起動
プロジェクトの設定
本の中ではクリップで行いますが、敷きにくいのでIntelliJで行います.
IntelliJでMavenプロジェクトを作成する
H 2データベースのインストール
1.4.198以降は、セキュリティ上の問題でデータベースが自動的に生成されないため、直接データベースを作成する必要があります.brew install h2
h2
Embeddedモードで接続テストを行うと、Serverモードで動作します.(ダメならなるべく開けてみます)
サンプル・テーブルの作成
ライブラリとプロジェクト構造
Java用のプロジェクト管理ツール管理ツール(ライブラリ管理機能と構築機能を含む)
これは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;
}
}
@Entity
JPAにクラスをテーブルにマッピングするように伝えます.エンティティークラス@Table
エンティティ・クラスにマッピングするテーブル情報を通知します.name
属性でメンバーエンティティをMEMBERテーブルにマッピングし、省略するとクラス名をテーブル名にマッピングします.@Id
Pirmary Key(デフォルトキー)をマップします.@Id
を使用するフィールドを識別子フィールドと呼びます.@Column
フィールドをカラムにマップします.name
プロパティを使用して、メンバーエンティティのユーザー名フィールドをMEMBERテーブルのNAME列にマッピングします.マッピング宣言が省略されている場合は、フィールド名を使用してカラム名にマッピングします.データベースが大文字と小文字を区別する場合は、
name
プロパティに明示的にマッピングする必要があります.persistence.xml設定
<?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(); // 엔티티 매니저 팩토리 종료
トランザクション管理
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
JPQLは、エンティティオブジェクト(クラスおよびフィールド)についてクエリーを行います.
List<Member> members = em.createQuery("select m from Member m", Member.class).getResultList();
Reference
Reference
この問題について(2.JPAの起動), 我々は、より多くの情報をここで見つけました https://velog.io/@yuyun0124/JPA-스터디-2장テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol