2014-02-17 2 views
2

Я использую Hibernate Interceptor с (hibernate 4.x). Я хочу выполнить некоторую операцию по сохранению метода сеанса. Поэтому я расширяю EmptyInterceptor.Как использовать single sessionFactory для спящего режима Intercepter

Он имеет следующие методы:

onSave() //when save operation is preformed. 
postFlush() //called after committed into database 

ПРОБЛЕМА: в postFlush() Я хочу, чтобы выполнить операцию SAVE. Так что мой контроль застрял в цикле. потому что whenver session.save() вызывается моими вызовами, метод onSave() и postFlush() EmptyInterceptor получил вызов для перехвата операции SAVE.

Чтобы устранить эту проблему, я использовал TWO сессионные заводы. 1 для выполнения сеансовых операций (сохранение, обновление и т. Д.) И 2-й для HibernateIntercepter.

Но я беспокоюсь, как я могу разобраться с этой проблемой с помощью single sessionFactory ??

общественного класса AudiLogInterceptor расширяет EmptyInterceptor {

public boolean onSave(Object entity, Serializable id, Object[] state, 
     String[] propertyNames, Type[] types) { 
    return false; 
} 

// called after committed into database 
public void postFlush(Iterator iterator) { 
    // want to perform SAVE operation here with Session.save() 
    // But whenever I open new seesion here. It falls in loop 
    Session tempSession = HibernateUtil.hibernateTemplateLog 
      .getSessionFactory().openSession(); 

    try { 
     Item item = new Item(); 
     item.setName("anyItem"); 
     item.setValue("anyValue"); 
     tempSession.save(item); 
     tempSession.flush(); 
    } finally { 
     tempSession.close(); 
    } 
    } 
} 

ответ

0

Вы не использовать перехватчики для сохранения объектов. Вы используете его для изменения/форматирования элементов и позволяете объекту сеанса делать остальное для вашего, но не добавляете новые элементы.

Если вы действительно хотите добавить строку в конец flush() или commit(), вы используете Spring-AOP, чтобы сделать это как один из параметров. Там вы можете добавить «Советы» в службы спящего режима, поэтому вы можете сэкономить сразу после запуска метода.

Работающ Я думал, что следующее.

public void postFlush(Iterator iterator) { 


for(; iterator.hasNext();) { 
    if(!(iterator.next() instanceof Item)){ //<<<<< You verify if you are saving Item or //other objects, if saving Item, skip this block. 

    Session tempSession = HibernateUtil.hibernateTemplateLog 
      .getSessionFactory().openSession(); 

    try { 
     Item item = new Item(); 
     item.setName("anyItem"); 
     item.setValue("anyValue"); 
     tempSession.save(item); 
     tempSession.flush(); 
    } finally { 
     tempSession.close(); 
    } 
} 
} 
    } 
} 
+0

На самом деле я использую перехватчик для спящего режима для AUDIT LOGGING. Значит, всякий раз, когда будет какая-либо операция SAVE или UPDATE, мой перехватчик будет использовать этот метод и вставить новую запись в таблицу журнала аудита (информация о сущности, что на самом деле было раньше и что является текущим). Вот код ссылки. http://www.mkyong.com/hibernate/hibernate-interceptor-example-audit-log/ – user3029929

+0

В приведенной ссылке примера автор связывает перехватчик с определенным сеансом, поэтому, если он сохраняет или обновление у него не было бы проблемы с циклом. Вы привязываете это к сеансу? или вы применили перехватчик для всего приложения? Если вы подали заявку на сеанс, то, пожалуйста, взгляните на работу, о которой я упоминал, определите объект, который находится в пост-флеше, если это объект AuditLog, затем пропустите блок сохранения аудита, поэтому последующее сохранение будет не следует вызывать, чтобы программа не переходила в цикл. – Zeus

+0

Можете ли вы сообщить мне, как связать перехватчик с сеансом? Я не могу найти метод на sessionfactory, который принимает Connection как аргумент – user3029929

Смежные вопросы