Wednesday, 14 August 2013

DML operation in hibernate eventlistener

DML operation in hibernate eventlistener

here's a sample of what I need:
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;
}
So, the event is executed but I don't know how to update user entity from
inside this listner. event.getSession().update(user); - don't work Is
there any way to do it?
Spring is managing my db sessions.
Spring - 3.1.0.RELEASE Hibernate - 3.5.6-Final

No comments:

Post a Comment