본문 바로가기

JPA (Java Persistence API)/Setup on Java SE Project

JPA Setup on Java SE Project

Java SE 프로젝트에서 JPA를 설정하고 테스트하는 예

테스트 환경
  Java SE 6, Eclipse 3.5, JPA (EclipseLink 2.2), Oracle 10g, ojdbc14.jar

Download
 - EclipseLink 2.2 :http://www.eclipse.org/eclipselink/downloads/

Build Path 에 추가할 외부 라이브러리 파일의 종류
 - eclipselink.jar, jpa2.2xxxxxx.jar, ojdbc14.jar



테이블
준비
 - create table PERSON ( id number primary key, name varchar2(20) not null, phone varchar2(20) );

Java SE 프로젝트/src/META-INF/persistence.xml 내용

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
 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_1_0.xsd">
 <persistence-unit name="people">
 
  <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

  <class>jpatest.Person</class>

  <properties>
   <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.OracleDriver" />
   <property name="javax.persistence.jdbc.url" value="jdbc:oracle:thin:@localhost:1521:ora10g" />
   <!-- I work in this example without user / password.-->
   <property name="javax.persistence.jdbc.user" value="scott" />
   <property name="javax.persistence.jdbc.password" value="tiger" />

   <!-- EclipseLink should create the database schema automatically -->

<!--필요한 테이블(PERSON, SEQUENCE)이 자동으로 생성되도록 설정함,
아래의 설정은 프로그램 시작시 마다 자동생성된 테이블들을 삭제하고 다시 생성하도록 설정한 내용이므로, 최초로 시작시만 활성화하고 이후에는 아래의 라인을 주석처리하면 기존 데이터를 유지할 수 있다
create-tables 만 설정하고 프로그램을 실행하면 기존 테이블의 존재에도 불구하고 또 테이블을 생성하려고 하므로 [기존 객체가 이름을 사용하고 있습니다] 라는 오류가 발생한다
-->

   <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />프로그램시작시마다 삭제후 생성됨
   <property name="eclipselink.ddl-generation.output-mode" value="database" />
  </properties>

 </persistence-unit>
</persistence>


Entity Bean( Person.java)

package jpatest;

import javax.persistence.*;

@Entity
public class Person {
 @Id
 @GeneratedValue
 private int id;

 private String name;
 private String phone;

public Person(){}

public Person(String name, String phone) {
 this.name = name;
 this.phone = phone;
}
 public int getId() {
  return id;
 }
 public void setId(int id) {
  this.id = id;
 }
 public String getName() {
  return name;
 }
 public void setName(String name) {
  this.name = name;
 }
 public String getPhone() {
  return phone;
 }
 public void setPhone(String phone) {
  this.phone = phone;
 }
}


JPATest.java ( EntityManager 를 사용하여 엔티티빈을 다루는 예, 주석처리된 부분 참조)

package jpatest;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

public class JPATest {

 private static final String PERSISTENCE_UNIT_NAME = "people";
 private static EntityManagerFactory factory;
  static {
   factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
  }

 public static void insert() throws Exception {
  EntityManager em = factory.createEntityManager();
 
  em.getTransaction().begin();
  Person p = new Person();
  p.setName("홍길동");   p.setPhone("235-654-567");
  em.persist(p);
  em.flush();
  em.getTransaction().commit();
  em.close();
 }
 
 public static void select()throws Exception{
  EntityManager em = factory.createEntityManager();
  /*
  Person p = em.find(Person.class, 1);
  System.out.println("검색결과:"+p.getPhone());
  */
  Query query = em.createQuery("select p from Person p");
  List<Person> list = query.getResultList();
  printResult(list);
  em.close();
 }
 
 public static void update()throws Exception {
  EntityManager em = factory.createEntityManager();
  em.getTransaction().begin();
  /*
  Person p = em.find(Person.class, 1);
  p.setPhone("444444444");
  */
  Query query = em.createQuery("select p from Person p");
  List<Person> list = query.getResultList();
  Person p = list.get(0);
  p.setPhone("5555555");
  em.getTransaction().commit();
  em.close();
 }
 
 public static void delete()throws Exception {
  EntityManager em = factory.createEntityManager();
  em.getTransaction().begin();
  /*
  Person p = em.find(Person.class, 1);
  em.remove(p);
  */
  Query query = em.createQuery("select p from Person p");
  List<Person> list = query.getResultList();
  Person p = list.get(0);
  em.remove(p);
  em.getTransaction().commit();
  em.close();
 }
 
 public static void main(String[] args)throws Exception{
  insert();
  select();
  update();
  select();
  delete();
  select();
 }
 
 private static void printResult(List<Person> list){
  for(int i=0;i<list.size();i++){
   Person p = list.get(i);
   System.out.println(p.getId()+"\t"+p.getName()+"\t"+p.getPhone());
  }
  System.out.println("-----------------------------");
 }
}


 



Query 오브젝트를 사용하는 예

package jpatest;

import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.Query;

public class JPATest {

 private static final String PERSISTENCE_UNIT_NAME = "people";
 private static EntityManagerFactory factory;

 
 public static void main(String[] args)throws Exception{

  setUp();
  //insert(createPerson());
  //select();
  //update();
  //delete();
  //Person p = findById(51);
  //System.out.println(p.getId()+"\t"+p.getName()+"\t"+p.getPhone());
  //update(51);
  //delete(55);
  select();
 }
 
 public static void setUp() throws Exception {
  factory = Persistence.createEntityManagerFactory(PERSISTENCE_UNIT_NAME);
 }
 
 public static void insert(Person[] p) throws Exception {
   EntityManager em = factory.createEntityManager();
   
   em.getTransaction().begin();
   for(int i=0;i<p.length;i++){
    em.persist(p[i]);       // 테이블에 레코드 한개 저장
   }
   em.getTransaction().commit();
   em.close();
 }
 
 public static void select() throws Exception {
  EntityManager em = factory.createEntityManager();

  Query query = em.createQuery("SELECT p FROM Person p order by p.id"); // JPQL(Java Persistence Query Language
  List<Person> list = query.getResultList();
  for(int i=0;i<list.size();i++){
   Person p = list.get(i);
   int id = p.getId();
   String name = p.getName();
   String phone = p.getPhone();
   System.out.println("id:"+id+"\tName:"+name+"\tPhone:"+phone);
  }
  em.close();
 }
 
 public static void update(int id) throws Exception {
  EntityManager em = factory.createEntityManager();
  Person p = em.find(Person.class, id);
  em.getTransaction().begin();
  p.setPhone("3333-4444-5555");
  em.persist(p);

  em.getTransaction().commit();
  em.close();
 }
 
 public static void delete(int id) throws Exception {
  EntityManager em = factory.createEntityManager();
  Person p = em.find(Person.class, id);
  em.getTransaction().begin();
  em.remove(p);     // 테이블에서 레코드 삭제
  em.getTransaction().commit();
  em.close();
 }
 
 /* 아이디를 파라미터로 받아서 테이블에서 검색하여 Person객체를 리턴하는 메소드 */
 public static Person findById(int id){
  EntityManager em = factory.createEntityManager();
  Person p = em.find(Person.class, id);
  em.close();
  return p;
 }
 
 private static Person[] createPerson(){
  Person[] p = new Person[5];
  p[0] = new Person("박세리", "345-756-3245");
  p[1] = new Person("박찬호", "643-745-346");
  p[2] = new Person("박지성", "0987-789-5432");
  p[3] = new Person("김연아", "456-345-876");
  p[4] = new Person("차범근", "534-8756-7890");
  return p;
 }
}