Eclipse에서 JPA (Java Persistence API)

소개



JPA의 샘플 프로그램을 Eclipse로 만들어 보겠습니다.
MVC 프로그램 를 개조해, JPA 를 사용해 Postgre SQL 의 DB 로부터 데이터를 취득합니다.
미리 Emplyee 테이블을 작성해 둡니다. (참조: Postgre SQL 설치 )

개발 환경



Windows 10 Pro 1709(16299.192)
Eclipse pleiades-4.7.3
java 1.8.0_162
PostgreSQL 10.4 Released!

절차



1. PostgreSQL JDBC Driver 다운로드

2. 프로젝트의 WEB-INF\lib에 복사

3. Postgres SQL에 대한 연결 만들기

4. JPA 프로젝트로 변환

5. 소스 코드 변경

6. 동작 확인

1. PostgreSQL JDBC Driver 다운로드



URL


https://jdbc.postgresql.org/download.html

1. PostgreSQL JDBC 4.2 Driver, 42.2.2 클릭





2. 프로젝트의 WEB-INF\lib에 복사





3. Postgres SQL에 대한 연결 만들기



1. 창 -> 보기 표시 -> 기타 메뉴 선택





2. 데이터 관리, 데이터 소스 탐색기를 선택하고 열기를 클릭하십시오.





3. 데이터 소스 연결에서 오른쪽 메뉴, 새로 만들기를 클릭합니다.





4. Postgres SQL을 선택하고 다음을 클릭합니다.





5. 데이터베이스, URL, 사용자 이름, 비밀번호를 입력하고 연결 테스트를 클릭합니다.



6. "Ping이 성공적으로 완료되었습니다"를 확인하고 "OK"버튼을 클릭하십시오.



7. 마침 버튼을 클릭





8. Postgre SQL 설치에서 작성한 테이블을 확인할 수 있다





4. JPA 프로젝트로 변환



1. 프로젝트에서 오른쪽 메뉴 -> 구성 -> JPA 프로젝트로 변환 선택





2. 다음 클릭





3. EclipseLink 2.5.2를 선택하고 다음을 클릭합니다.





4. "이 라이선스 조항에 위탁"을 체크하고 "완료"클릭





5. 새 PostgreSQL 연결을 선택하고 빌드 경로, 연결에서 기본 카탈로그 덮어쓰기, 연결에서 기본 스키마 재정의를 선택하고 마침을 클릭합니다.





6. 프로젝트에서 오른쪽 메뉴 -> JPA 도구 -> 테이블에서 엔티티 생성을 선택





7. employee 테이블을 선택하고 마침 클릭





5. 소스 코드 변경



1. Employee Entity에 findById @NamedQuery 추가


変更前

@Entity
@NamedQuery(name="Employee.findAll", query="SELECT e FROM Employee e")
public class Employee implements Serializable {
変更後

@Entity
@NamedQueries({
    @NamedQuery(name="Employee.findAll", query="SELECT e FROM Employee e"),
    @NamedQuery(name = "Employee.findById", query = "SELECT e from Employee e where e.id = :id")
})
public class Employee implements Serializable {

2. EmployeeServlet을 DB에서 검색하도록 변경


変更後

package emp;

import java.io.IOException;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import model.Employee;


/**
 * Servlet implementation class EmployeeServlet
 */
@WebServlet(name = "EmpList", urlPatterns = { "/EmpList" })
public class EmployeeServlet extends HttpServlet {
    private static final long serialVersionUID = 1L;

    /**
     * @see HttpServlet#HttpServlet()
     */
    public EmployeeServlet() {
        super();
    }

    /**
     * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("SampleMVC2");
        EntityManager entityManager = emf.createEntityManager();

        List<Employee> employeeList = entityManager
                .createNamedQuery("Employee.findAll", Employee.class)
                .getResultList();

        entityManager.close();
        emf.close();


        // ViewへModelデータを渡す
        request.setAttribute("employeeList", employeeList);

        // Viewを表示
        this.getServletContext()
            .getRequestDispatcher("/employeeList.jsp")
            .forward(request, response);
    }

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        EntityManagerFactory emf = Persistence.createEntityManagerFactory("SampleMVC2");
        EntityManager entityManager = emf.createEntityManager();

        List<Employee> employeeList;

        String id = request.getParameter("id");

        if (id.isEmpty()) {
            employeeList = entityManager
                    .createNamedQuery("Employee.findAll", Employee.class)
                    .getResultList();
        }
        else {
            employeeList = entityManager
                    .createNamedQuery("Employee.findById", Employee.class)
                    .setParameter("id", id)
                    .getResultList();
        }

        entityManager.close();
        emf.close();

        // ViewへModelデータを渡す
        request.setAttribute("employeeList", employeeList);


        // Viewを表示
        this.getServletContext()
            .getRequestDispatcher("/employeeList.jsp")
            .forward(request, response);

    }

}

3. EmployeeBean에서 오른쪽 메뉴 -> 삭제 선택





4. OK 선택





5. persistence.xml 변경


変更前

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="SampleMVC">
        <class>model.Employee</class>
    </persistence-unit>
</persistence>
変更後(DB接続情報追加)

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" xmlns="http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
    <persistence-unit name="SampleMVC2">
        <class>model.Employee</class>
        <properties>
            <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver" /> <!-- DB Driver -->
            <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost/postgres" /> <!-- BD Mane -->
            <property name="javax.persistence.jdbc.user" value="postgres" /> <!-- DB User -->
            <property name="javax.persistence.jdbc.password" value="dev" /> <!-- DB Password -->
        </properties>
    </persistence-unit>
</persistence>


6. 동작 확인



Eclipse에서 MVC.의 동작 확인 참조

결론


  • EntityManager에 어노테이션 @PersistenceContext은 트랜잭션 관리 (컨테이너 관리) 된 경우에만 부여 할 수 있습니다. 그렇지 않은 경우는 @PersistenceContext 는 무시된다.
  • 좋은 웹페이지 즐겨찾기