수색…
비고
JPA는 Java Persistence API입니다. Java Persistence API는 Java 객체 및 관계와 관계형 데이터베이스의 매핑을 처리하는 사양입니다. 이것을 객체 - 관계 매퍼 (ORM)라고합니다. 저수준 JDBC에 대한 대안 (또는 보완)입니다. Java 지향 접근법을 추구 할 때와 복잡한 객체 그래프를 유지해야 할 때 가장 유용합니다.
JPA 자체는 구현이 아닙니다. 이를 위해 지속성 공급자가 필요합니다 (예제 참조). 최신 JPA 2.1 표준의 현재 구현은 EclipseLink ( "사양을 구현할 수 있다는 증거"를 의미하는 JPA 2.1의 참조 구현)입니다. 최대 절전 모드 및 DataNucleus .
메타 데이터
Java 오브젝트와 데이터베이스 테이블 간의 매핑은 지속성 메타 데이터 를 통해 정의됩니다. JPA 프로 바이더는 영속 메타 데이터 정보를 사용하여 올바른 데이터베이스 작업을 수행합니다. JPA는 일반적으로 Java 클래스의 주석을 통해 메타 데이터를 정의합니다.
객체 - 관계형 엔티티 아키텍처
엔티티 아키텍처는 다음으로 구성됩니다.
- 엔티티
- 지속성 단위
- 영속성 문맥
- 엔티티 관리자 팩토리
- 엔티티 관리자
버전
설치 또는 설정
클래스 패스 요구 사항
Eclipselink
Eclipselink 및 JPA API가 포함되어야합니다. 예제 Maven 종속성 :
<dependencies>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>eclipselink</artifactId>
<version>2.6.3</version>
</dependency>
<dependency>
<groupId>org.eclipse.persistence</groupId>
<artifactId>javax.persistence</artifactId>
<version>2.1.1</version>
</dependency>
<!-- ... -->
</dependencies>
최대 절전 모드
최대 절전 모드 코어가 필요합니다. 예제 메이븐 종속성 :
<dependencies>
<dependency>
<!-- requires Java8! -->
<!-- as of 5.2, hibernate-entitymanager is merged into hibernate-core -->
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.2.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate.javax.persistence</groupId>
<artifactId>hibernate-jpa-2.1-api</artifactId>
<version>1.0.0</version>
</dependency>
<!-- ... -->
</dependencies>
DataNucleus
datanucleus-core, datanucleus-api-jpa 및 datanucleus-rdbms (RDBMS 데이터 저장소 사용시)가 필요합니다. 예제 메이븐 종속성 :
<dependencies>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-core</artifactId>
<version>5.0.0-release</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-api-jpa</artifactId>
<version>5.0.0-release</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>datanucleus-rdbms</artifactId>
<version>5.0.0-release</version>
</dependency>
<dependency>
<groupId>org.datanucleus</groupId>
<artifactId>javax.persistence</artifactId>
<version>2.1.2</version>
</dependency>
<!-- ... -->
</dependencies>
구성 세부 정보
JPA는 CLASSPATH의 루트에서 META-INF
아래에있는 파일 persistence.xml을 사용해야합니다. 이 파일은 JPA가 작동 할 수있는 사용 가능한 지속성 단위의 정의를 포함합니다.
또한 JPA는 META-INF
아래에 배치 된 매핑 구성 파일 orm.xml을 사용할 수 있습니다. 이 맵핑 파일은 클래스가 데이터 스토어에 맵핑되는 방식을 구성하는 데 사용되며 JPA 엔티티 클래스 자체에서 Java 주석을 사용하는 대체 / 보완 메소드입니다.
최소한의 persistence.xml 예제
Hibernate (및 임베디드 H2 DB)
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
<persistence-unit name="persistenceUnit">
<provider>org.hibernate.ejb.HibernatePersistence</provider>
<class>my.application.entities.MyEntity</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver" />
<property name="javax.persistence.jdbc.url" value="jdbc:h2:data/myDB.db" />
<property name="javax.persistence.jdbc.user" value="sa" />
<!-- DDL change options -->
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<property name="hibernate.flushMode" value="FLUSH_AUTO" />
</properties>
</persistence-unit>
</persistence>
Eclipselink (및 임베디드 H2 DB)
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
<persistence-unit name="persistenceUnit">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<class>my.application.entities.MyEntity</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:data/myDB.db"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<!-- Schema generation : drop and create tables -->
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create-tables" />
</properties>
</persistence-unit>
</persistence>
DataNucleus (및 임베디드 H2 DB)
<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_2_1.xsd"
version="2.1">
<persistence-unit name="persistenceUnit">
<provider>org.datanucleus.api.jpa.PersistenceProviderImpl</provider>
<class>my.application.entities.MyEntity</class>
<properties>
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="javax.persistence.jdbc.url" value="jdbc:h2:data/myDB.db"/>
<property name="javax.persistence.jdbc.user" value="sa"/>
<!-- Schema generation : drop and create tables -->
<property name="javax.persistence.schema-generation.database.action" value="drop-and-create-tables" />
</properties>
</persistence-unit>
</persistence>
안녕하세요 세계
간단한 Hallo World를 만들기위한 모든 기본 구성 요소를 보도록하겠습니다.
- 우리가 사용할 JPA 2.1의 구현을 정의하십시오.
-
persistence-unit
생성하는 데이터베이스에 대한 연결을 구축하십시오. - 엔티티를 구현합니다.
- 엔터티를 조작하기 위해 DAO (데이터 액세스 개체)를 구현합니다.
- 응용 프로그램 테스트
도서관
Maven을 사용하려면 다음과 같은 의존성이 필요하다.
<dependencies>
<!-- JPA is a spec, I'll use the implementation with HIBERNATE -->
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>5.2.6.Final</version>
</dependency>
<!-- JDBC Driver, use in memory DB -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.193</version>
</dependency>
</dependencies>
영속성 단위
resources 폴더에서 persistence.xml
파일을 만들어야합니다. 그것을 정의하는 가장 쉬운 방법은 다음과 같습니다.
<persistence-unit name="hello-jpa-pu" transaction-type="RESOURCE_LOCAL">
<provider>org.hibernate.jpa.HibernatePersistenceProvider</provider>
<properties>
<!-- ~ = relative to current user home directory -->
<property name="javax.persistence.jdbc.url" value="jdbc:h2:./test.db"/>
<property name="javax.persistence.jdbc.user" value=""/>
<property name="javax.persistence.jdbc.password" value=""/>
<property name="javax.persistence.jdbc.driver" value="org.h2.Driver"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.H2Dialect"/>
<property name="hibernate.show_sql" value="true"/>
<!-- This create automatically the DDL of the database's table -->
<property name="hibernate.hbm2ddl.auto" value="create-drop"/>
</properties>
</persistence-unit>
엔티티 구현
나는 Biker
클래스를 만든다 :
package it.hello.jpa.entities;
import javax.persistence.*;
import java.io.Serializable;
import java.util.Date;
import java.util.List;
@Entity
@Table(name = "BIKER")
public class Biker implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
@Column(name = "bikerName")
private String name;
@Column(unique = true, updatable = false)
private String battleName;
private Boolean beard;
@Temporal(TemporalType.DATE)
private Date birthday;
@Temporal(TemporalType.TIME)
private Date registrationDate;
@Transient // --> this annotiation make the field transient only for JPA
private String criminalRecord;
public Long getId() {
return this.id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name = name;
}
public String getBattleName() {
return battleName;
}
public void setBattleName(String battleName) {
this.battleName = battleName;
}
public Boolean getBeard() {
return this.beard;
}
public void setBeard(Boolean beard) {
this.beard = beard;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
public Date getRegistrationDate() {
return registrationDate;
}
public void setRegistrationDate(Date registrationDate) {
this.registrationDate = registrationDate;
}
public String getCriminalRecord() {
return criminalRecord;
}
public void setCriminalRecord(String criminalRecord) {
this.criminalRecord = criminalRecord;
}
}
DAO 구현하기
package it.hello.jpa.business;
import it.hello.jpa.entities.Biker;
import javax.persistence.EntityManager;
import java.util.List;
public class MotorcycleRally {
public Biker saveBiker(Biker biker) {
EntityManager em = EntityManagerUtil.getEntityManager();
em.getTransaction().begin();
em.persist(biker);
em.getTransaction().commit();
return biker;
}
}
EntityManagerUtil
은 싱글 톤입니다.
package it.hello.jpa.utils;
import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
public class EntityManagerUtil {
// USE THE SAME NAME IN persistence.xml!
public static final String PERSISTENCE_UNIT_NAME = "hello-jpa-pu";
private static EntityManager entityManager;
private EntityManagerUtil() {
}
public static EntityManager getEntityManager() {
if (entityManager == null) {
// the same in persistence.xml
EntityManagerFactory emFactory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
return emFactory.createEntityManager();
}
return entityManager;
}
}
응용 프로그램 테스트
package it.hello.jpa.test;
public class TestJpa {
@Test
public void insertBiker() {
MotorcycleRally crud = new MotorcycleRally();
Biker biker = new Biker();
biker.setName("Manuel");
biker.setBeard(false);
biker = crud.saveBiker(biker);
Assert.assertEquals(biker.getId(), Long.valueOf(1L));
}
}
출력은 다음과 같습니다.
실행 중 it.hello.jpa.test.TestJpa Hibernate : 테이블이 존재하면 BIKER Hibernate : hibernate_sequence가 존재한다면 hibernate : 시퀀스 생성 hibernate_sequence는 1만큼 증가한다. Hibernate : 테이블 생성 BIKER (id bigint not null, battleName varchar (255 최대 수면 상태 : BIKER (BattleName, beard, birthday, bikerName, registrationDate), BIKER (BattleName, beard, 생일, bikerName, 생일 날짜, bikerName varchar (255), 등록일, 기본 키 , id) 값 (?,?,?,?,?,?) mar 01, 2017 11:00:02 PM org.hibernate.jpa.internal.util.LogHelper logPersistenceUnitInformation 정보 : HHH000204 : PersistenceUnitInfo 처리 [이름 : hello- jpa-pu ...] 결과 :
테스트 실행 : 1, 실패 : 0, 오류 : 0, 건너 뛰기 : 0