Столкнулся с неприятной ситуацией. Возможно кто-то подскажет решение.
Имеем некоторую сущность IdentityCard:
@Entity(name = "digitalid_IdentityCard")
public class IdentityCard extends BaseIdentityIdEntity implements Creatable, Updatable, SoftDelete {
//
}
И EntityChangedEvent для неё:
@Component("digitalid_IdentityCardChangedListener")
public class IdentityCardChangedListener {
@Inject
private TransactionalDataManager txDataManager;
@TransactionalEventListener(phase = TransactionPhase.BEFORE_COMMIT)
public void updateExamWithIdentityCard(EntityChangedEvent<IdentityCard, IdProxy<Long>> event) {
if (event.getType() != EntityChangedEvent.Type.CREATED)
return;
System.out.printf("EntityId=[%s]\n", event.getEntityId()); // для дебага
final IdentityCard identityCard = txDataManager.load(event.getEntityId())
.viewProperties("employee")
.one();
// далее что-то делаем с identityCard
}
}
И в “обычной” ситуации всё работает и в консоли видим (например)
EntityId=[Id{ru.consyst.kolnpp.asup.digitalid.entity.IdentityCard, 2210}]
Где 2210 действительно ID для последней вставленной в таблицу digitalid_IdentityCard строки.
Потом возникла необходимость на таблицу digitalid_IdentityCard повесить триггер
CREATE OR REPLACE TRIGGER identity_card_changed_trigger
AFTER INSERT OR UPDATE
ON digital_id.digid_identity_card
FOR EACH ROW
EXECUTE FUNCTION digital_id.identity_card_changed();
CREATE OR REPLACE FUNCTION digital_id.identity_card_changed() RETURNS TRIGGER
AS $function$
DECLARE new_update_ts timestamp;
BEGIN
new_update_ts = CASE WHEN NEW.update_ts = OLD.update_ts THEN current_timestamp ELSE NEW.update_ts END;
IF (TG_OP = 'INSERT' AND NEW.delete_ts IS NULL) THEN
IF (NEW.status <> 'CANCELED') THEN
INSERT INTO digital_id._changes_audit (entity_id, entity_class, action_, update_ts)
VALUES(NEW.id, 'digitalid_IdentityCard', 'CREATE', new_update_ts);
END IF;
END IF;
RETURN NULL;
END;
$function$ LANGUAGE plpgsql;
В результате, при попытке сохранить новый экземпляр сущности **IdentityCard ** получаю ошибку
ava.lang.IllegalStateException: No results
at com.haulmont.cuba.core.global.FluentLoader$ById.one(FluentLoader.java:270) ~[cuba-global-7.2.20.jar:7.2.20]
at ru.consyst.kolnpp.asup.digitalid.listeners.IdentityCardChangedListener.updateExamWithIdentityCard(IdentityCardChangedListener.java:35) ~[digitalid-core-0.1-SNAPSHOT.jar:na]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_323]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_323]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_323]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_323]
at org.springframework.context.event.ApplicationListenerMethodAdapter.doInvoke(ApplicationListenerMethodAdapter.java:344) ~[spring-context-5.3.23.jar:5.3.23]
at org.springframework.context.event.ApplicationListenerMethodAdapter.processEvent(ApplicationListenerMethodAdapter.java:229) ~[spring-context-5.3.23.jar:5.3.23]
at org.springframework.transaction.event.TransactionalApplicationListenerSynchronization.processEventWithCallbacks(TransactionalApplicationListenerSynchronization.java:80) ~[spring-tx-5.3.23.jar:5.3.23]
at org.springframework.transaction.event.TransactionalApplicationListenerSynchronization.beforeCommit(TransactionalApplicationListenerSynchronization.java:59) ~[spring-tx-5.3.23.jar:5.3.23]
at com.haulmont.cuba.core.sys.persistence.PersistenceImplSupport$ContainerResourceSynchronization.publishEntityChangedEvents(PersistenceImplSupport.java:529) ~[cuba-core-7.2.20.jar:7.2.20]
at com.haulmont.cuba.core.sys.persistence.PersistenceImplSupport$ContainerResourceSynchronization.beforeCommit(PersistenceImplSupport.java:457) ~[cuba-core-7.2.20.jar:7.2.20]
at org.springframework.transaction.support.TransactionSynchronizationUtils.triggerBeforeCommit(TransactionSynchronizationUtils.java:97) ~[spring-tx-5.3.23.jar:5.3.23]
at org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCommit(AbstractPlatformTransactionManager.java:916) ~[spring-tx-5.3.23.jar:5.3.23]
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:727) ~[spring-tx-5.3.23.jar:5.3.23]
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:711) ~[spring-tx-5.3.23.jar:5.3.23]
at com.haulmont.cuba.core.sys.TransactionImpl.commit(TransactionImpl.java:104) ~[cuba-core-7.2.20.jar:7.2.20]
at com.haulmont.cuba.core.app.RdbmsStore.commit(RdbmsStore.java:561) ~[cuba-core-7.2.20.jar:7.2.20]
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:1.8.0_323]
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:1.8.0_323]
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:1.8.0_323]
at java.lang.reflect.Method.invoke(Method.java:498) ~[na:1.8.0_323]
at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:344) ~[spring-aop-5.3.23.jar:5.3.23]
at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:198) [spring-aop-5.3.23.jar:5.3.23]
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) [spring-aop-5.3.23.jar:5.3.23]
...
а в консоли вижу
EntityId=[Id{ru.consyst.kolnpp.asup.digitalid.entity.IdentityCard, 25226}]
где 25226 - это ID записи в таблицу _changes_audit, которая вставилась в результате выполнения триггерной функции.
Т.е., как будто, в event попал ID строки не из таблицы сущности IdentityCard, а последнего выполненного insert’а в транзакции, или как-то так.
Ну и в результате
final IdentityCard identityCard = txDataManager.load(event.getEntityId())
.viewProperties("employee")
.one();
конечно не даст результата, потому что с id=25226 сущности IdentityCard нет, т.к. реально у ней id=2210.
Есть какие-то предложения что с этим можно сделать?