Configuration configuration = new Configuration(); configuration.setInterceptor(new MyInterceptor()); SessionFactory sessionFactory = configuration.buildSessionFactory(); Session session1 = sessionFactory.openSession(); Employee e1, e2 = null; // Assume e1 and e2 objects are associated with session1. Session session2 = sessionFactory.openSession(); User u1, u2 = null //Assume u1 and u2 objects are associated with session1.global-scoped 인터셉터는 Configuration.setInterceptor(Interceptor) 메소드를 사용하여 애플리케이션에 설정할 수 있습니다. 위의 코드에 두 개의 세션 객체인 ‘session1’과 ‘session2’가 있습니다. Employee 타입의 객체인 e1과 e2는 ‘session1’과 연관되어 있고 User 타입의 객체인 u1과 u2는 ‘session2’와 연관되어 있다고 가정해 봅시다. 이 때 application-scoped 인터셉터는 비록 다른 세션에 담겨있지만 모든 객체들(e1, e2, u1, u2)에 영향을 줄 것입니다.
Configuration configuration = new Configuration(); SessionFactory sessionFactory = configuration.buildSessionFactory(); MyInterceptor myInterceptor = new MyInterceptor(); Session session1 = sessionFactory.openSession(myInterceptor); Employee e1, e2 = null; // Assume e1 and e2 objects are associated with session "session1". MyAnotherInterceptor myAnotherInterceptor = new MyAnotherInterceptor (); Session session2 = sessionFactory.openSession(myAnotherInterceptor); User u1, u2 = null; // Assume u1 and u2 objects are associated with session "session2".위 코드를 보면 session-scoped 인터셉터는 SessionFactory.openSession(Interceptor). 메소드를 호출하여 설정할 수 있다는 것을 알 수 있습니다. 위의 코드에서 두 개의 session 객체인 ‘session1’과 ‘session2’는 각각 MyInterceptor and MyAnotherInterceptor 가 설정되었습니다. 따라서 e1과 e2 객체는 MyInterceptor 의 영향을 받고 u1과 u2는 MyAnotherInterceptor 의 영향을 받습니다.
import java.util.Date; import org.hibernate.classic.Validatable; import org.hibernate.classic.ValidationFailure; public class ProjectDuration implements Validatable{ private Date startDate; private Date endDate; /// Other Code here. public void validate(){ if (startDate.after(endDate)){ throw new ValidationFailure( "Start Date cannot be greater than the End Date.") } } }위의 퍼시스턴트 클래스인 ProjectDuration 은 Validatable 인터페이스를 구현하였고 validate 메소드 안에 startDate가 endDate 이후가 될 수 없다는 간단한 검증 룰을 구현하였습니다. 이 Validatable.validate() 메소드는 프레임워크에 의해 저장 기능을 수행 할 때 호출 될 것입니다. 저장은 Session.save(), Session.update(), Session.saveOrUpdate(), Session.flush() 메소드를 호출할 때 발생합니다.
onLoad() | 이 메소드는 영속성 객체를 로딩하기 전에 호출 됩니다. 예) Session.load()를 호출 했을 때 |
onSave() | 이 메소드는 Session.save() 또는 Session.saveorUpdate() 같은 저장하는 기능을 수행하기 전에 호출 됩니다. |
onUpdate() | 이 메소드는 영송석 객체의 속성을 수정(update)하기 전에 호출 됩니다. 예) Session.update() 를 호출 했을 때 |
onDelete() | 이 메소드는 삭제하기(delete) 전에 실행 됩니다. 예) Session.delete() 를 호출 했을 때 |
import org.hibernate.Session; import org.hibernate.classic.Lifecycle; class MyCustomizedPeristentClass implements Lifecycle{ } public boolean onDelete(Session s) throws CallbackException { return false; } public void onLoad(Session s, Serializable id) { System.out.println("Loading"); } public boolean onSave(Session s) throws CallbackException { return false; } public boolean onUpdate(Session s) throws CallbackException { return false; } }3-3. ‘Interceptor’ 인터페이스
afterTransactionBegin() | 트랜잭션을 시작하기 전에 호출됩니다. 예) Session.startTransaction() 메소드가 호출 될 때 |
beforeTransactionCompletion() | 트랜잭션이 끝나기(커밋 또는 롤백) 직전에 호출 됩니다. 예) Transaction.commit() 또는 Transaction.rollback() |
afterTransactionCompletion() | 트랜잭션이 끝난(커밋 또는 롤백) 뒤에 호출 됩니다. |
onSave() | onSave() 에 정의한 내용은 엔티티의 속성 이름, 그것들의 값, 그것들의 상태 등 다양한 정보를 인자로 받게 됩니다. 그리고 저장하는 메소드인 Session.save(), Session.saveOrUpdate(), Session.flush(), Transaction.commit() 이 수행 될 때 호출 됩니다. |
onUpdate() | 개정된 onUpdate() 메소드는 엔티티 속성의 이름, 그것들의 값, 그것들의 상태 등 다양한 정보를 인자로 받게 됩니다. 그리고 영속성 객체의 속성이 수정(update) 되려고 할 때 호출 됩니다. 수정하기 작업은 Session.update(), Session.saveOrUpdate(), Session.flush(), Transaction.commit()에 의해 수행합니다. |
onLoad() | onLoad() 메소드는 엔티티 속성의 이름, 그것들의 값, 그것들의 상태 등 다양한 정보를 인자로 받게 됩니다. 그리고 영속성 객체가 불러지려고 할 때 호출 됩니다. 예) Session.load() 를 호출 할 때 |
onDelete() | onDelete()메소드는 엔티티 속성의 이름, 그것들의 값, 그것들의 상태 등 다양한 정보를 인자로 받게 됩니다. 그리고 영속성 객체가 삭제 되기 전에 호출 됩니다. 예) Session.delete() 를 호출 할 때 |
이전 글 : 루비 온 레일즈, 이클립스를 만나다(3)
다음 글 : 하이버네이트 인터셉터 소개(2)
최신 콘텐츠