package interceptor; import java.io.Serializable; import org.hibernate.CallbackException; import org.hibernate.Session; import org.hibernate.classic.Lifecycle; import org.hibernate.classic.Validatable; import org.hibernate.classic.ValidationFailure; public class PlayerName implements Validatable, Lifecycle { private String firstName; private String middleName; private String lastName; private String completeName; private String primaryKey; public PlayerName(){ } public String getFirstName() { return firstName; } public void setFirstName(String firstName) { this.firstName = firstName; } public String getLastName() { return lastName; } public void setLastName(String lastName) { this.lastName = lastName; } public String getMiddleName() { return middleName; } public void setMiddleName(String middleName) { this.middleName = middleName; } public String getCompleteName() { return completeName; } public void setCompleteName(String completeName) { this.completeName = completeName; } public String getPrimaryKey() { return primaryKey; } public void setPrimaryKey(String primaryKey) { this.primaryKey = primaryKey; } public void validate() throws ValidationFailure { if ((firstName.equals(middleName)) && (middleName.equals(lastName))){ throw new ValidationFailure("First Name, Middle Name and Last Name cannot be the same"); } } 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; } }위에 있는 ‘PlayerName’ 클래스는 데이터베이스에 저장하고 싶은 영속성 클래스를 나타냅니다. 이 클래스드는 각각 선수의 이름, 중간 이름, 성을 나타내는 firstname, middleName, lastName 속성을 가지고 있습니다. 주키를 나타내기 위해 애플리케이션에서 직접 설정하는 primaryKey 속성도 가지고 있습니다.
package interceptor; import java.io.Serializable; import org.hibernate.EmptyInterceptor; import org.hibernate.type.Type; public class CustomSaveInterceptor extends EmptyInterceptor { public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { if (entity instanceof PlayerName){ PlayerName playerName = (PlayerName)entity; String completeName = playerName.getFirstName() + " " + playerName.getMiddleName() + " " + playerName.getLastName(); playerName.setCompleteName(completeName); } return super.onSave(entity, id, state, propertyNames, types); } }onSave() 메소드를 자세히 보면 다양한 매개변수들을 가지고 있는 것을 볼 수 있습니다. entity는 저장할 객체를 나타냅니다. id는 직렬화 가능한(Serializable 인터페이스를 구현한) 주키를 나타냅니다(여기서는 String 객체를 사용했습니다.). state 배열은 영속성 객체가 가지고 있는 속성들의 값을 나타냅니다. propertyNmaes 배열은 String 값들의 배열로 firstname, middleName, lastName, completeName을 포함하고 있습니다. PlayerName 클레스에 있는 속성의 타입들이 전부 문자열이기 때문에 Type의 배열은 String 타입을 나타낼 것입니다.
package interceptor; import java.io.Serializable; import org.hibernate.EmptyInterceptor; import org.hibernate.type.Type; public class LoggerInterceptor extends EmptyInterceptor{ public boolean onSave(Object entity, Serializable id, Object[] state, String[] propertyNames, Type[] types) { System.out.println("Saving the persistent Object " + entity.getClass() + " with Id " + id); return super.onSave(entity, id, state, propertyNames, types); } }LoggerInterceptor 클레스 구현은 onSave() 메소드를 구현하여 콘솔 창에 로그 정보를 출력하도록 재정의 하는 것이 전부 입니다.
package interceptor; import java.util.List; import org.hibernate.*; import org.hibernate.cfg.Configuration; import org.hibernate.classic.Validatable; public class InterceptorTest { public static void main(String[] args) { Configuration configuration = new Configuration().configure(); configuration.setInterceptor(new CustomSaveInterceptor()); SessionFactory sessionFactory = configuration.buildSessionFactory(); Session session = sessionFactory.openSession(new LoggerInterceptor()); createPlayerNames(session); listPlayerNames(session); } private static void createPlayerNames(Session session){ PlayerName rahul = createPlayerName("Rahul", "Sharad", "Dravid", "RSD"); PlayerName dhoni = createPlayerName("Mahendra", "Singh", "Dhoni", "MSD"); PlayerName karthik = createPlayerName("Krishnakumar", "Dinesh", "Karthik", "KDK"); PlayerName same = createPlayerName("Same", "Same", "Same", "SME"); Transaction transaction = session.beginTransaction(); try{ session.save(rahul); session.save(dhoni); session.save(karthik); Transaction innerTransaction = null; try{ innerTransaction = session.beginTransaction(); session.save(same); }catch(Exception exception){ System.out.println("n" + exception.getMessage()); }finally{ if (innerTransaction.isActive()){ innerTransaction.commit(); } } }catch(Exception exception){ System.out.println(exception.getMessage()); transaction.rollback(); session.clear(); }finally{ if (transaction.isActive()){ transaction.commit(); } } session.flush(); } private static PlayerName createPlayerName(String fName, String mName,String lName, String id){ PlayerName playerName = new PlayerName(); playerName.setFirstName(fName); playerName.setMiddleName(mName); playerName.setLastName(lName); playerName.setPrimaryKey(id); return playerName; } private static void listPlayerNames(Session session){ Query query = session.createQuery("From PlayerName"); List allPlayers = query.list(); System.out.println("n"); for(PlayerName player : allPlayers){ listPlayerName(player); } } private static void listPlayerName(PlayerName player){ StringBuilder result = new StringBuilder(); result.append("First Name = ").append(player.getFirstName()) .append(" , Middle Name = ") .append(player.getMiddleName()). append(" , Last Name = "). append(player.getLastName()). append(" , Full Name = ").append(player.getCompleteName()); System.out.println(result.toString()); } }위의 코드에서 CustomSaveInterceptor를 Configuration.setInterceptor(new CustomSaveInterceptor())를 사용하여 전역적(global-scoped)으로 설정하였습니다. LoggerInterceptor는 SessionFactory.openSession(new LoggerInterceptor())를 사용하여 세션 기반(session-scoped)으로 설정하였습니다. createPlayerNames() 메소드는 테스트 용도의 player 객체를 생성합니다. ‘same’객체는 first-name, middle-name, last-name 모두 ‘Same’으로 같게 하여 Validator 인터셉터가 포착할 수 있도록 했습니다.
Saving the persistent Object class interceptor.PlayerName with Id RSD Saving the persistent Object class interceptor.PlayerName with Id MSD Saving the persistent Object class interceptor.PlayerName with Id KDK First Name, Middle Name and Last Name cannot be the same First Name = Rahul , Middle Name = Sharad , Last Name = Dravid , Full Name = Rahul Sharad Dravid First Name = Mahendra , Middle Name = Singh , Last Name = Dhoni , Full Name = Mahendra Singh Dhoni First Name = Krishnakumar , Middle Name = Dinesh , Last Name = Karthik , Full Name = Krishnakumar Dinesh Karthik4-2. 하이버네이트 설정과 맵핑 파일
playername.hmb.xml:com.mysql.jdbc.Driver jdbc:mysql://localhost/dbforhibernate root root org.hibernate.dialect.MySQLDialect
5. 요약 및 정리
이전 글 : 하이버네이트 인터셉터 소개(1)
다음 글 : GCC 파라메터와 친해지기(1)
최신 콘텐츠