Batch 처리는 전통적으로 전체 객체/관계형 매핑에서 어려웠다. ORM은 객체 상태 관리에 관한 모든 것이고, 그것은 객체 상태가 메모리 내에서 이용 가능하다는 점을 의미한다. 하지만 Hibernate는 Hibernate 참조 안내서에서 논의되어 있는 batch 처리를 최적화 시키는 몇몇 특징들을 갖고 있지만, EJB3 영속은 약간 다르다.
이미 논의했듯이, 자동적인 그리고 투명한 객체/관계형 매핑이 객체의 상태를 관리하는 것에 관계된다. 이것은 객체 상태가 메모리 내에서 이용 가능하고, 그러므로 (SQL UPDATE와 DELETE를 사용하여) 데이터베이스 내에서 직접 데이터를 업데이트하거나 삭제하는 것은 메모리 내 상태에 영향을 주지 않을 것이다. 하지만 Hibernate는 EJB-QL(7장. EJB-QL: 객체 질의 언어(Object Query Language))을 통해 수행되는 대용량 SQL-스타일의 UPDATE 및 DELETE 문장 실행을 위한 메소드들을 제공한다.
UPDATE와 DELETE 문장들을 위한 유사-구문은 다음이다: ( UPDATE | DELETE ) FROM? ClassName (WHERE WHERE_CONDITIONS)?. 다음을 노트하라:
from-절에서, FROM 키워드는 옵션이다.
from-절 내에 명명된 한 개의 클래스 만이 존재할 수 있고, 그것은 하나의 alias를 가질 수 없다(이것은 현재 Hibernate 제약점이고 곧 제거될 것이다).
(함축적이든 명시적이든) 조인들은 대용량 EJB-QL 질의 내에 지정될 수 없다. 서브-질의들은 where-절 속에 사용될 수 있다.
where-절은 또한 옵션이다.
하나의 EJB-QL UPDATE를 실행하기 위한 하나의 예제로서, Query.executeUpdate() 메소드를 사용하라:
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
String ejbqlUpdate = "update Customer set name = :newName where name = :oldName"
int updatedEntities = entityManager.createQuery( hqlUpdate )
.setParameter( "newName", newName )
.setParameter( "oldName", oldName )
.executeUpdate();
entityManager.getTrasnaction().commit();
entityManager.close();하나의 EJB-QL DELETE를 실행하기 위해, 같은 Query.executeUpdate() 메소드를 사용하라(그 메소드는 JDBC의 PreparedStatement.executeUpdate()에 익숙한 사람들을 위해 명명된다):
EntityManager entityManager = entityManagerFactory.createEntityManager();
entityManager.getTransaction().begin();
String hqlDelete = "delete Customer where name = :oldName";
int deletedEntities = entityManager.createQuery( hqlDelete )
.setParameter( "oldName", oldName )
.executeUpdate();
entityManager.getTrasnaction().commit();
entityManager.close();Query.executeUpdate() 메소드에 의해 반환된 int 값은 그 연산에 의해 영향받은 엔티티들의 개수를 나타낸다. 이것은 데이터베이스내에서 영향받은 많은 행들에 관련될 수 있거나 관계되지 않을 수 있다. 하나의 EJB-QL 대용량 연산은 예를 들어 조인된-서브클래스(joined-subclass)에 대해 실행되는 여러 개의 실제 SQL 문장들로 귀결될 수 있다. 반환되는 개수는 그 문장에 의해 영향받은 실제 엔티티들의 개수를 나타낸다. 조인된-서브클래스 예제로 되돌아가면, 서브클래스들 중 하나에 대한 삭제는 실제로 단지 그 서브클래스가 매핑되어 있는 테이블에 대한 것이 아니라, 또한 "루트" 테이블 과 상속 계층을 더 내려간 잠정적으로 조인된-서브클래스 테이블들에 대한 삭제들로 귀결될 수 있다.
장래의 배포본들에서 제기될 대용량 연산들에 대해 가진 몇몇 제약점들이 존재함을 노트하라; 상세한 것은 JIRA 로드맵을 참조하라.