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;
}
}