January 2009 Archives

JPA에서 데이터를 수정, 삭제하는 방법은 크게 두가지로 나뉠수 있다. 첫째로 JPA에서 제공하는 EntityManager를 사용하는 방법. 그리고, JPQL에서 UPDATE, DELETE를 실행하는 방법. 여기서 이야기 하고자 하는 것은 JPQL에서 UPDATE, DELETE 하는 방법이다. (bulk update / delete 라고 한다.)
JPQL을 이용하여 데이터를 DELETE 하는 방법은 쉽다. 아래 소스를 참고하자.

@PersistenceContext em;
. . .
// start transaction 
Query query = em.createQuery("DELETE USER u WHERE u.status = :status "); 
query.setParameter("status", 'GOLD');
int results = query.executeUpdate();
//end transaction

UPDATE 하는 방법 또한 동일하다. 고로 UPDATE 예제는 생략하도록 하겠다.
이제 하고자 하는 이야기를 하자. 위의 예제는 의도하여 삽입하였다. 무슨 이야기? 예제에서 트랜젝션의 시작과 끝을 알리는 주석에 주목해보자. 타 작업(task)이 포함되어 있지 않고, 하나의 트랜젝션으로 묶여 있다. 왜 그럴까? 누가 그랬을까? 

만일, 위의 예제를 실행하고 나서 다른 작업을 시도한다면, 의도한 데이터 저장/수정, 삭제 작업은 이루어지지 않을 것이다.  왜? 
JPA는 EntityManager가 엔티티Entity의 영속성(Persistance)를 관리하고 있다. 엔티티는 많은 관계들로 연결되어 있고, 이 관계들도 EntityManager가 관리하고 있다. Vender에서 사용하는 것처럼 JPA에서 Update, Delete문을 사용하게 된다면, EntityManager는 할일이 엄청나게 많아 질 것이다. 그럼 EntityManager를 관할하는 WAS도 우리에게 불만을 내뿜게 될게 뻔하지 않은가? 고로, JPA는 (bulk) Update, Delete를 실행했을 경우, EntityManager는 사용한 엔티티들을 Detached 상태로 되돌려 놓고, 트랜젝션이 종료되기를 기다리도록 하였다. 그러므로, 의도한 데이터작업은 실행할 수 없는 것이다. 


요약하자면, bulk UPDATE, DELETE 를 사용했을 시엔 테잎 갈고 하자.


참조 : EJB3 In Action, Debu Panda, Reza Rahman, Derek Lane, Manning, 2007

Recent Comments

동치미 on 오브젝트와 오브젝트 타입, 그리고 클래스: 에~ 시간이 없어서
동치미 on WP의 부활: //드루지기 안녕하
드루지기 on WP의 부활: 워드프레스 좋지요.
동치미 on 느림의 미학: [민달이] 감사합니
민달이 on 느림의 미학: 저도 여유를 가지자
동치미 on 철학을가진개발자 Vs 그렇지않은개발자: [데꾸벅] 막걸리
동치미 on 근황!: //kimgisa
kimgisa on 근황!: Email 주소 안
데꾸벅 on 철학을가진개발자 Vs 그렇지않은개발자: 장신정신 = 철학
동치미 on 근황!: 민달이님 때문이라도

Sign In

About this Archive

Find recent content on the main index or look in the archives to find all content.