Entity Inspector Error : IllegalStateException Cannot get unfetched attribute from object [managed]

Hi ,
I have below case,
EntityA:

    @Column(name = "STATE")
    protected Integer state;

    @Transient
    @MetaProperty
    protected Integer prevState;

And with below listener:

@Component("uadm_EntityAListener")
public class EntityAListener implements BeforeDetachEntityListener<EntityA>, BeforeInsertEntityListener<EntityA>, BeforeUpdateEntityListener<EntityA>, AfterInsertEntityListener<EntityA>, AfterUpdateEntityListener<EntityA> {
    @Inject
    private Persistence persistence;

    @Override
    public void onBeforeDetach(EntityA entity, EntityManager entityManager) {
        if (!persistence.getTools().isDirty(entity)) {
            entity.setPrevState(entity.getState());
        }
    }
    @Override
    public void onAfterInsert(EntityA entity, Connection connection) {
        entity.setPrevState(entity.getState());
    }

    @Override
    public void onAfterUpdate(EntityA entity, Connection connection) {
        Optional.ofNullable(entity.getState())
                .ifPresent(theState -> {
                    if (!Objects.equal(theState , entity.getPrevState()) &&
                            Objects.equal(theState , StateEnum.activated)) {
//business logic
                    }
                });
        entity.setPrevState(entity.getState());
    }

Notice that there is a onBeforeDetach listener.

Then I have another EntityB which has ManytoOne relation to EntityA.

    @ManyToOne(fetch = FetchType.LAZY)
    @OnDelete(DeletePolicy.UNLINK)
    @JoinColumn(name = "COLUMN_A")
    protected EntityA entityInstanceA;

While try to open Entity Inspector of EntityB, the code in onBeforeDetach triggered below error:
Entity Inspector Error : IllegalStateException: Cannot get unfetched attribute [state] from object xx.entity.EntityA-c7474599-8640-b39c-49d2-2ecae289e449 [managed]

I try to change fetchType to (fetch = FetchType.EAGER), but still got same error.

How to solve this?

Hi.
Could you please provide more information about your problem? Which version of the platform do you use?

Hi Natalia,

The problem is that I can’t use Entity Inspector to open EntityB, due to the error. I’m on platform 6.10.3

Could you please share with us the full stacktrace of the exception?

Hi Natalia,

I found that in EntityInspectorBrowse.java, in method createView(), it will use minimal view for association or composition relationship. In this case, it will not load extra properties. As a workaround, I added State property to entity @NamePattern to force State property loaded in minimal view make this exception gone. It’s your call to decide if this is a bug. :slight_smile:

                case ASSOCIATION:
                case COMPOSITION:
                    if (!metaProperty.getRange().getCardinality().isMany()) {
                        View minimal = metadata.getViewRepository()
                                .getView(metaProperty.getRange().asClass(), View.MINIMAL);
                        View propView = new View(minimal, metaProperty.getName() + "Ds", false);
                        view.addProperty(metaProperty.getName(), propView);
                    }
                    break;
java.lang.IllegalStateException: Cannot get unfetched attribute [state] from object com.tcx.uadm.entity.EntityA-40193651-f5cb-ad25-9820-69eafdc5d060 [managed]
	at org.eclipse.persistence.internal.jpa.EntityManagerImpl.processUnfetchedAttribute(EntityManagerImpl.java:2848)
	at com.haulmont.chile.core.model.impl.AbstractInstance._persistence_checkFetched(AbstractInstance.java)
	at com.tcx.uadm.entity.EntityA._persistence_get_state(EntityA.java)
	at com.tcx.uadm.entity.EntityA.getstate(EntityA.java:179)
	at com.tcx.uadm.listener.EntityAEntityListener.onBeforeDetach(EntityAEntityListener.java:42)
	at com.tcx.uadm.listener.EntityAEntityListener.onBeforeDetach(EntityAEntityListener.java:26)
	at com.haulmont.cuba.core.sys.listener.EntityListenerManager.fireListener(EntityListenerManager.java:234)
	at com.haulmont.cuba.core.sys.persistence.PersistenceImplSupport.fireBeforeDetachEntityListener(PersistenceImplSupport.java:202)
	at com.haulmont.cuba.core.sys.persistence.PersistenceImplSupport$ContainerResourceSynchronization.beforeCommit(PersistenceImplSupport.java:437)
	at org.springframework.transaction.support.TransactionSynchronizationUtils.triggerBeforeCommit(TransactionSynchronizationUtils.java:95)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCommit(AbstractPlatformTransactionManager.java:936)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:748)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:734)
	at com.haulmont.cuba.core.sys.TransactionImpl.commit(TransactionImpl.java:104)
	at com.haulmont.cuba.core.app.RdbmsStore.loadList(RdbmsStore.java:248)
	at com.haulmont.cuba.core.app.DataManagerBean.loadList(DataManagerBean.java:74)
	at com.haulmont.cuba.core.app.DataServiceBean.loadList(DataServiceBean.java:54)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.support.AopUtils.invokeJoinpointUsingReflection(AopUtils.java:333)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.invokeJoinpoint(ReflectiveMethodInvocation.java:190)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157)
	at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:84)
	at com.haulmont.cuba.core.sys.ServiceInterceptor.aroundInvoke(ServiceInterceptor.java:117)
	at sun.reflect.GeneratedMethodAccessor205.invoke(Unknown Source)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:627)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:616)
	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:168)
	at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92)
	at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179)
	at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:213)
	at com.sun.proxy.$Proxy110.loadList(Unknown Source)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.haulmont.cuba.core.sys.remoting.LocalServiceInvokerImpl.invoke(LocalServiceInvokerImpl.java:94)
	at com.haulmont.cuba.web.sys.remoting.LocalServiceProxy$LocalServiceInvocationHandler.invoke(LocalServiceProxy.java:154)
	at com.sun.proxy.$Proxy256.loadList(Unknown Source)
	at com.haulmont.cuba.EntityA.sys.DataManagerEntityAImpl.loadList(DataManagerEntityAImpl.java:57)
	at com.haulmont.cuba.gui.data.impl.GenericDataSupplier.loadList(GenericDataSupplier.java:117)
	at com.haulmont.cuba.gui.data.impl.CollectionDatasourceImpl.loadData(CollectionDatasourceImpl.java:613)
	at com.haulmont.cuba.gui.data.impl.CollectionDatasourceImpl.refresh(CollectionDatasourceImpl.java:161)
	at com.haulmont.cuba.gui.data.impl.CollectionDatasourceImpl.refreshIfNotSuspended(CollectionDatasourceImpl.java:112)
	at com.haulmont.cuba.gui.components.filter.FilterDelegateImpl.refreshDatasource(FilterDelegateImpl.java:1644)
	at com.haulmont.cuba.gui.components.filter.FilterDelegateImpl.apply(FilterDelegateImpl.java:1488)
	at com.haulmont.cuba.web.gui.components.WebFilter.apply(WebFilter.java:82)
	at com.haulmont.cuba.gui.app.core.entityinspector.EntityInspectorBrowse.createFilter(EntityInspectorBrowse.java:298)
	at com.haulmont.cuba.gui.app.core.entityinspector.EntityInspectorBrowse.createEntitiesTable(EntityInspectorBrowse.java:282)
	at com.haulmont.cuba.gui.app.core.entityinspector.EntityInspectorBrowse.showEntities(EntityInspectorBrowse.java:173)
	at com.haulmont.cuba.gui.app.core.entityinspector.EntityInspectorBrowse.lambda$init$0(EntityInspectorBrowse.java:150)
	at com.haulmont.bali.events.EventRouter.fireEvent(EventRouter.java:45)
	at com.haulmont.cuba.web.gui.components.WebLookupField.lambda$attachListener$4850968e$1(WebLookupField.java:212)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:498)
	at com.vaadin.event.ListenerMethod.receiveEvent(ListenerMethod.java:510)
	at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:200)
	at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:163)
	at com.vaadin.server.AbstractEntityAConnector.fireEvent(AbstractEntityAConnector.java:1037)
	at com.vaadin.ui.AbstractField.fireValueChange(AbstractField.java:1199)
	at com.vaadin.ui.AbstractField.setValue(AbstractField.java:600)
	at com.vaadin.ui.AbstractSelect.setValue(AbstractSelect.java:738)
	at com.vaadin.ui.AbstractField.setValue(AbstractField.java:494)
	at com.vaadin.ui.ComboBox.changeVariables(ComboBox.java:750)
	at com.haulmont.cuba.web.toolkit.ui.CubaComboBox.changeVariables(CubaComboBox.java:167)
	at com.vaadin.server.communication.ServerRpcHandler.changeVariables(ServerRpcHandler.java:623)
	at com.vaadin.server.communication.ServerRpcHandler.handleInvocation(ServerRpcHandler.java:470)
	at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:413)
	at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:274)
	at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:90)
	at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
	at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1435)
	at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:361)
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:312)
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:203)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:742)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:107)
	at com.haulmont.cuba.web.security.idp.BaseIdpSessionFilter.doFilter(BaseIdpSessionFilter.java:220)
	at org.springframework.web.filter.CompositeFilter$VirtualFilterChain.doFilter(CompositeFilter.java:112)
	at org.springframework.web.filter.CompositeFilter.doFilter(CompositeFilter.java:73)
	at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:107)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:198)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:493)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:140)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:81)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:650)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:87)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:342)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:800)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:806)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1498)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:748)

The problem occurs in your entity listener:
at com.tcx.uadm.listener.EntityAEntityListener.onBeforeDetach(EntityAEntityListener.java:42).

You need to inject the EntityStates bean to your listener and check that the entity attributes are loaded using isLoaded() method.