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