2013-08-14 4 views
0

вот пример того, что мне нужно:операции DML в спящем EventListener

public class UserTransactionManager implements PreInsertEventListener, PreUpdateEventListener, 
    ApplicationContextAware { 

private static final long serialVersionUID = -3535037001167635519L; 
private static Log   log    = LogFactory.getLog(UserTransactionManager.class); 

private ApplicationContext context; 

@Override 
public boolean onPreUpdate(PreUpdateEvent event) { 
    if (event.getEntity() instanceof UserTransaction) { 
     try { 
      UserTransaction transaction = (UserTransaction) event.getEntity(); 
      log.debug("Pre update transaction action: " + transaction.getId()); 
      Integer index = Arrays.asList(event.getPersister().getPropertyNames()).indexOf(
        "payed"); 
      if (!(Boolean) event.getOldState()[index] && (Boolean) event.getState()[index]) { 
       AppUser user = (AppUser) event.getSession().load(AppUser.class, 
         transaction.getUser().getId()); 
       if (transaction.getType() == TransactionType.INCOMING) { 
        user.setBalance(user.getBalance() + transaction.getValue()); 
       } else { 
        user.setBalance(user.getBalance() - transaction.getValue()); 
       } 
       transaction.setBalance(user.getBalance()); 
       event.getSession().update(user); 
      } else if ((Boolean) event.getOldState()[index] 
        && !(Boolean) event.getState()[index]) { 
       AppUser user = (AppUser) event.getSession().load(AppUser.class, 
         transaction.getUser().getId()); 
       if (transaction.getType() == TransactionType.INCOMING) { 
        user.setBalance(user.getBalance() - transaction.getValue()); 
       } else { 
        user.setBalance(user.getBalance() + transaction.getValue()); 
       } 
       transaction.setBalance(user.getBalance()); 
       event.getSession().update(user); 
      } 
     } catch (Throwable ex) { 
      return true; 
     } 
    } 
    return false; 
} 

Таким образом, событие выполняется, но я не знаю, как обновить пользовательский объект внутри этого list3ner. event.getSession().update(user); не работает

Есть ли способ сделать это?

Весна управляет моими сессиями db.

Весна - 3.1.0.RELEASE Hibernate - 3.5.6-Final

ответ

0

Не сохранять или обновлять объект внутри слушателя, и это в не требуется. Намерение слушателя - это разрешить изменение объекта Entity перед сохранением. поэтому сеанс hibernate позаботится об изменениях, присутствующих в модели, что означает, что вы можете свободно изменять поля объектов.

Пожалуйста, убедитесь, что тип возврата должен быть прав. видеть ссылки http://docs.jboss.org/hibernate/orm/3.6/javadocs/org/hibernate/event/PreInsertEventListener.html

if (event.getEntity() instanceof UserTransaction) { 

     try{ 

      ---------------- 
      ------------- 
      return true; 
     } catch (Throwable ex) { 
      return false; // you already got exception so not required the partial changes in your entity. 
     } 
+0

Итак, как я могу обновить объект B, когда компания А обновляется? Что-то вроде триггера DB, но из Spring или Hibernate? Также в EventListener вы возвращаете true, если хотите повысить вето. – Mystery

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