JPA 란 무엇입니까? Java Persistence API 소개

사양으로서 Java Persistence API는 지속성과 관련이 있습니다. 이는 Java 객체가이를 생성 한 애플리케이션 프로세스보다 오래 지속 되는 모든 메커니즘을 의미합니다. 모든 Java 개체를 유지해야하는 것은 아니지만 대부분의 응용 프로그램은 주요 비즈니스 개체를 유지합니다. JPA를 사양은 사용자가 정의 할 수 있는 개체를 유지해야하는지, 그리고 어떻게 그 객체는 자바 애플리케이션에서 지속되어야한다.

그 자체로 JPA는 도구 나 프레임 워크가 아닙니다. 오히려 모든 도구 또는 프레임 워크에서 구현할 수있는 개념 집합을 정의합니다. JPA의 ORM (object-relational mapping) 모델은 원래 Hibernate를 기반으로했지만 그 이후로 발전했습니다. 마찬가지로 JPA는 원래 관계형 / SQL 데이터베이스와 함께 사용하기위한 것이었지만 일부 JPA 구현은 NoSQL 데이터 저장소와 함께 사용하도록 확장되었습니다. NoSQL과 함께 JPA를 지원하는 널리 사용되는 프레임 워크는 JPA 2.2의 참조 구현 인 EclipseLink입니다.

Jakarta EE의 JPA 2.2

Java Persistence API는 Java EE 5에서 EJB 3.0 사양 (JSR 220)의 하위 집합으로 처음 릴리스되었습니다. 이후 Java EE 6 (JSR 317)의 JPA 2.0 릴리스부터 자체 사양으로 발전했습니다. 이 글을 쓰는 시점에서 JPA 2.2는 Jakarta EE의 일부로 계속해서 채택되었습니다.

JPA 및 최대 절전 모드

서로 얽힌 역사 때문에 Hibernate와 JPA는 자주 결합됩니다. 그러나 Java Servlet 사양과 마찬가지로 JPA는 많은 호환 도구 및 프레임 워크를 생성했습니다. Hibernate는 그중 하나 일뿐입니다.

Gavin King이 개발하고 2002 년 초에 출시 한 Hibernate는 Java 용 ORM 라이브러리입니다. King은 지속성을위한 엔티티 빈의 대안으로 Hibernate를 개발했습니다. 프레임 워크는 매우 인기가 있었고 당시에 필요했기 때문에 많은 아이디어가 첫 번째 JPA 사양에서 채택되고 코드화되었습니다.

오늘날 Hibernate ORM은 가장 성숙한 JPA 구현 중 하나이며 여전히 Java에서 ORM을위한 인기있는 옵션입니다. Hibernate ORM 5.3.8 (이 글을 쓰는 현재 버전)은 JPA 2.2를 구현합니다. 또한 Hibernate의 도구 제품군은 NoSQL에 대한 도메인 모델 지속성을 지원하는 Hibernate Search, Hibernate Validator 및 Hibernate OGM과 같은 인기있는 도구를 포함하도록 확장되었습니다.

JPA 및 EJB

앞서 언급했듯이 JPA는 EJB 3.0의 하위 집합으로 도입되었지만 이후 자체 사양으로 발전했습니다. EJB는 JPA와 다른 초점을 가진 사양이며 EJB 컨테이너에서 구현됩니다. 각 EJB 컨테이너에는 JPA 사양에 정의 된 지속성 계층이 포함됩니다.

Java ORM이란 무엇입니까?

실행은 다르지만 모든 JPA 구현은 일종의 ORM 계층을 제공합니다. JPA 및 JPA 호환 도구를 이해하려면 ORM에 대해 잘 알고 있어야합니다.

객체 관계형 매핑은 개발자가 수동으로 수행하는 것을 피해야 할 합당한 이유 가있는 작업 입니다. Hibernate ORM 또는 EclipseLink와 같은 프레임 워크는 해당 작업을 라이브러리 또는 프레임 워크 인 ORM 레이어 로 코드화합니다 . 응용 프로그램 아키텍처의 일부로서 ORM 계층은 관계형 데이터베이스의 테이블 및 열과 상호 작용하는 소프트웨어 개체의 변환을 관리합니다. Java에서 ORM 계층은 관계형 데이터베이스에 저장 및 관리 할 수 ​​있도록 Java 클래스와 객체를 변환합니다.

기본적으로 유지되는 개체의 이름은 테이블의 이름이되고 필드는 열이됩니다. 테이블이 설정되면 각 테이블 행은 애플리케이션의 개체에 해당합니다. 개체 매핑은 구성 가능하지만 기본값은 잘 작동하는 경향이 있습니다.

NoSQL을 사용한 JPA

최근까지 비 관계형 데이터베이스는 흔하지 않은 호기심이었습니다. NoSQL 운동으로 모든 것이 바뀌었고 이제 Java 개발자는 다양한 NoSQL 데이터베이스를 사용할 수 있습니다. 일부 JPA 구현은 Hibernate OGM 및 EclipseLink를 포함하여 NoSQL을 수용하도록 발전했습니다.

그림 1은 애플리케이션 개발에서 JPA 및 ORM 계층의 역할을 보여줍니다.

자바 월드 /

Java ORM 계층 구성

JPA를 사용하도록 새 프로젝트를 설정할 때 데이터 저장소 및 JPA 공급자를 구성해야합니다. 선택한 데이터베이스 (SQL 또는 NoSQL)에 연결하도록 데이터 저장소 커넥터 를 구성합니다 . Hibernate 또는 EclipseLink와 같은 프레임 워크 인 JPA 공급자 도 포함하고 구성합니다 . JPA를 수동으로 구성 할 수 있지만 많은 개발자가 Spring의 기본 지원을 사용하기로 선택합니다. 수동 및 Spring 기반 JPA 설치 및 설정의 데모는 아래 " JPA 설치 및 설정 "을 참조하십시오 .

자바 데이터 객체

Java Data Objects는 주로 객체의 지속성 논리를 지원하고 비 관계형 데이터 저장소 작업에 대한 오랜 지원을 통해 JPA와 다른 표준화 된 지속성 프레임 워크입니다. JPA와 JDO는 JDO 공급자가 JPA도 자주 지원할 정도로 유사합니다. JPA 및 JDBC와 같은 다른 지속성 표준과 관련하여 JDO에 대해 자세히 알아 보려면 Apache JDO 프로젝트를 참조하십시오.

Java의 데이터 지속성

프로그래밍 관점에서 ORM 계층은 어댑터 계층입니다 . 개체 그래프의 언어를 SQL 및 관계형 테이블의 언어에 맞게 조정합니다. ORM 계층을 사용하면 객체 지향 개발자가 객체 지향 패러다임을 벗어나지 않고도 데이터를 유지하는 소프트웨어를 구축 할 수 있습니다.

JPA를 사용하는 경우 데이터 저장소에서 애플리케이션의 데이터 모델 객체로의 을 생성 합니다. 개체를 저장하고 검색하는 방법을 정의하는 대신 개체와 데이터베이스 간의 매핑을 정의한 다음 JPA를 호출하여 유지합니다. 관계형 데이터베이스를 사용하는 경우 애플리케이션 코드와 데이터베이스 간의 실제 연결의 대부분은 JDBC (Java Database Connectivity API)에 의해 처리됩니다.

사양으로 JPA는 객체와 데이터베이스 간의 매핑을 정의하는 데 사용하는 메타 데이터 주석을 제공 합니다. 각 JPA 구현은 JPA 주석을위한 자체 엔진을 제공합니다. JPA 사양은 또한 JPA 시스템과의 주요 접점 인 PersistanceManageror를 제공합니다 EntityManager(여기서 비즈니스 로직 코드는 매핑 된 객체로 수행 할 작업을 시스템에 알려줍니다).

이 모든 것을 더 구체적으로 만들기 위해 뮤지션 모델링을위한 간단한 데이터 클래스 인 목록 1을 고려하십시오.

Listing 1. 자바의 간단한 데이터 클래스

 public class Musician { private Long id; private String name; private Instrument mainInstrument; private ArrayList performances = new ArrayList(); public Musician( Long id, String name){ /* constructor setters... */ } public void setName(String name){ this.name = name; } public String getName(){ return this.name; } public void setMainInstrument(Instrument instr){ this.instrument = instr; } public Instrument getMainInstrument(){ return this.instrument; } // ...Other getters and setters... } 

Musician목록 1 의 클래스는 데이터를 보유하는 데 사용됩니다. 이름 필드 와 같은 기본 데이터를 포함 할 수 있습니다 . 또한 같은 다른 클래스에 관계 저장할 수 mainInstrumentperformances.

Musician존재에 대한 이유는 데이터를 포함하는 것입니다. 이러한 유형의 클래스를 DTO 또는 데이터 전송 개체 라고도 합니다 . DTO는 소프트웨어 개발의 공통 기능입니다. 여러 종류의 데이터를 보유하고 있지만 비즈니스 로직은 포함하지 않습니다. 데이터 개체 지속은 소프트웨어 개발에서 어디에나있는 과제입니다.

JDBC를 사용한 데이터 지속성

Musician클래스 의 인스턴스를 관계형 데이터베이스 에 저장하는 한 가지 방법 은 JDBC 라이브러리를 사용하는 것입니다. JDBC는 응용 프로그램이 기본 데이터베이스 구현에 대해 생각하지 않고 SQL 명령을 실행할 수 있도록하는 추상화 계층입니다.

목록 2는 MusicianJDBC를 사용 하여 클래스를 유지하는 방법을 보여줍니다 .

Listing 2. 레코드를 삽입하는 JDBC

 Musician georgeHarrison = new Musician(0, "George Harrison"); String myDriver = "org.gjt.mm.mysql.Driver"; String myUrl = "jdbc:mysql://localhost/test"; Class.forName(myDriver); Connection conn = DriverManager.getConnection(myUrl, "root", ""); String query = " insert into users (id, name) values (?, ?)"; PreparedStatement preparedStmt = conn.prepareStatement(query); preparedStmt.setInt (1, 0); preparedStmt.setString (2, "George Harrison"); preparedStmt.setString (2, "Rubble"); preparedStmt.execute(); conn.close(); // Error handling removed for brevity 

목록 2의 코드는 상당히 자체 문서화되어 있습니다. georgeHarrison객체는 어디서나 (제출 프런트 엔드, 외부 서비스 등)에서 올 수있는, 그 ID와 이름 필드를 설정하고있다. 그런 다음 개체의 필드를 사용하여 SQL insert문의 값을 제공합니다 . (이 PreparedStatement클래스는 JDBC의 일부이며 SQL 쿼리에 값을 안전하게 적용하는 방법을 제공합니다.)

JDBC는 수동 구성과 함께 제공되는 제어를 허용하지만 JPA에 비해 번거 롭습니다. 데이터베이스를 수정하려면 먼저 Java 개체에서 관계형 데이터베이스의 테이블로 매핑되는 SQL 쿼리를 만들어야합니다. 그런 다음 개체 서명이 변경 될 때마다 SQL을 수정해야합니다. JDBC를 사용하면 SQL 유지 관리가 그 자체로 작업이됩니다.

JPA를 사용한 데이터 지속성

이제 MusicianJPA를 사용 하여 클래스를 유지하는 목록 3을 고려하십시오 .

Listing 3. JPA로 George Harrison 유지하기

 Musician georgeHarrison = new Musician(0, "George Harrison"); musicianManager.save(georgeHarrison); 

목록 3은 목록 2의 수동 SQL을 단일 행으로 대체하여 session.save()JPA에 객체를 유지하도록 지시합니다. 그때부터 SQL 변환은 프레임 워크에 의해 처리되므로 객체 지향 패러다임을 벗어날 필요가 없습니다.

JPA의 메타 데이터 주석

목록 3의 마법은 JPA의 주석을 사용하여 생성 된 구성 의 결과입니다 . 개발자는 주석을 사용하여 JPA에 어떤 객체를 유지해야하며 어떻게 유지해야하는지 알려줍니다.

목록 4는 Musician단일 JPA 어노테이션이 있는 클래스를 보여줍니다 .

Listing 4. JPA의 @Entity 주석

 @Entity public class Musician { // ..class body } 

Persistent objects are sometimes called entities. Attaching @Entity to a class like Musician informs JPA that this class and its objects should be persisted.

XML vs. annotation-based configuration

JPA also supports using external XML files, instead of annotations, to define class metadata. But why would you do that to yourself?

Configuring JPA

Like most modern frameworks, JPA embraces coding by convention (also known as convention over configuration), in which the framework provides a default configuration based on industry best practices. As one example, a class named Musician would be mapped by default to a database table called Musician.

The conventional configuration is a timesaver, and in many cases it works well enough. It is also possible to customize your JPA configuration. As an example, you could use JPA's @Table annotation to specify the table where the Musician class should be stored.

Listing 5. JPA's @Table annotation

 @Entity @Table(name="musician") public class Musician { // ..class body } 

Listing 5 tells JPA to persist the entity (Musician class) to the musician table.

Primary key

In JPA, the primary key is the field used to uniquely identify each object in the database. The primary key is useful for referencing and relating objects to other entities. Whenever you store an object in a table, you will also specify the field to use as its primary key.

In Listing 6, we tell JPA what field to use as Musician's primary key.

Listing 6. Specifying the primary key

 @Entity public class Musician { @Id private Long id; 

In this case, we've used JPA's @Id annotation to specify the id field as Musician's primary key. By default, this configuration assumes the primary key will be set by the database--for instance, when the field is set to auto-increment on the table.

JPA supports other strategies for generating an object's primary key. It also has annotations for changing individual field names. In general, JPA is flexible enough to adapt to any persistence mapping you might need.

CRUD operations

Once you've mapped a class to a database table and established its primary key, you have everything you need to create, retrieve, delete, and update that class in the database. Calling session.save() will create or update the specified class, depending on whether the primary-key field is null or applies to en existing entity. Calling entityManager.remove() will delete the specified class.

Entity relationships in JPA

Simply persisting an object with a primitive field is only half the equation. JPA also has the capability to manage entities in relation to one another. Four kinds of entity relationships are possible in both tables and objects:

    1. One-to-many
    2. Many-to-one
    3. Many-to-many
    4. One-to-one

Each type of relationship describes how an entity relates to other entities. For example, the Musician entity could have a one-to-many relationship with Performance, an entity represented by a collection such as List or Set.

If the Musician included a Band field, the relationship between these entities could be many-to-one, implying collection of Musicians on the single Band class. (Assuming each musician only performs in a single band.)

If Musician included a BandMates field, that could represent a many-to-many relationship with other Musician entities.

마지막으로 유명한 인용문을 나타내는 데 사용되는 엔티티 와 일대일 관계를Musician 가질 수 있습니다 .QuoteQuote famousQuote = new Quote()

관계 유형 정의

JPA에는 각 관계 매핑 유형에 대한 주석이 있습니다. 당신이 사이에 일대 다 관계에 주석하는 방법 7은 목록 MusicianPerformance들.

Listing 7. 일대 다 관계에 주석 달기