수색…


비고

JPA는 Java Persistence API입니다. Java Persistence API는 Java 객체 및 관계와 관계형 데이터베이스의 매핑을 처리하는 사양입니다. 이것을 객체 - 관계 매퍼 (ORM)라고합니다. 저수준 JDBC에 대한 대안 (또는 보완)입니다. Java 지향 접근법을 추구 할 때와 복잡한 객체 그래프를 유지해야 할 때 가장 유용합니다.

JPA 자체는 구현이 아닙니다. 이를 위해 지속성 공급자가 필요합니다 (예제 참조). 최신 JPA 2.1 표준의 현재 구현은 EclipseLink ( "사양을 구현할 수 있다는 증거"를 의미하는 JPA 2.1의 참조 구현)입니다. 최대 절전 모드DataNucleus .

메타 데이터

Java 오브젝트와 데이터베이스 테이블 간의 매핑은 지속성 메타 데이터 를 통해 정의됩니다. JPA 프로 바이더는 영속 메타 데이터 정보를 사용하여 올바른 데이터베이스 작업을 수행합니다. JPA는 일반적으로 Java 클래스의 주석을 통해 메타 데이터를 정의합니다.

객체 - 관계형 엔티티 아키텍처

엔티티 아키텍처는 다음으로 구성됩니다.

  • 엔티티
  • 지속성 단위
  • 영속성 문맥
  • 엔티티 관리자 팩토리
  • 엔티티 관리자

버전

번역 전문가 그룹 해제
1.0 JSR-220 2006-11-06
2.0 JSR-317 2009-12-10
2.1 JSR-338 2013-05-22

설치 또는 설정

클래스 패스 요구 사항

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>
<?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를 만들기위한 모든 기본 구성 요소를 보도록하겠습니다.

  1. 우리가 사용할 JPA 2.1의 구현을 정의하십시오.
  2. persistence-unit 생성하는 데이터베이스에 대한 연결을 구축하십시오.
  3. 엔티티를 구현합니다.
  4. 엔터티를 조작하기 위해 DAO (데이터 액세스 개체)를 구현합니다.
  5. 응용 프로그램 테스트

도서관

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



Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow