Table for General Config

Hi, this post is for ask, the best way to create an Unique Entity on Application, for certains configurations, and then call from Any Entity this General Conf.

Thanks!

I’ve created this Table:


package com.company.imgestion.entity;

import javax.persistence.Entity;
import javax.persistence.Table;
import javax.persistence.Column;
import com.haulmont.cuba.core.entity.StandardEntity;

@Table(name = "IMGESTION_CONFIGURACION")
@Entity(name = "imgestion$Configuracion")
public class Configuracion extends StandardEntity {
    private static final long serialVersionUID = -870015935119584261L;

    @Column(name = "CONTADOR_CLIENTES", nullable = false)
    protected Integer contadorClientes = 0;

    public void setContadorClientes(Integer contadorClientes) {
        this.contadorClientes = contadorClientes;
    }

    public Integer getContadorClientes() {
        return contadorClientes;
    }


}

And then, a Browse Screen.

I’ve created then on Customer, and BeforeInsert Listener to get Value from field ContadorClitentes, but i Get error on this Line:


package com.company.imgestion.listener;

import com.company.imgestion.entity.Configuracion;
import com.company.imgestion.entity.Empresas;
import com.haulmont.cuba.core.Persistence;
import com.haulmont.cuba.core.global.DataManager;
import com.haulmont.cuba.core.global.LoadContext;
import com.haulmont.cuba.core.global.Metadata;
import org.springframework.stereotype.Component;
import com.haulmont.cuba.core.listener.BeforeInsertEntityListener;
import com.company.imgestion.entity.Clientes;

import javax.inject.Inject;
import java.util.List;

@Component("imgestion_AltaCliente")
public class AltaCliente implements BeforeInsertEntityListener<Clientes> {

    @Inject
    private Persistence persistence;

    @Inject
    private DataManager dataManager;

    @Inject
    private Metadata metadata;

    @Override
    public void onBeforeInsert(Clientes entity) {
        List<Configuracion> config = dataManager.loadList(
                LoadContext.create(Configuracion.class).setQuery(
                        <b>LoadContext.createQuery("select c from imgestion$Configuracion c")));</b>
        if (config.size() == 0) {
            Configuracion configuracion = metadata.create(Configuracion.class);
            configuracion.setContadorClientes(1);
            entity.setCodigo(1);
        } else {
            Integer count = config.get(1).getContadorClientes();
            count = count ++;
            config.get(1).setContadorClientes(count);
            entity.setCodigo(count);
        }
    }
}

Error:


java.lang.NullPointerException
	at com.company.imgestion.listener.AltaCliente.onBeforeInsert(AltaCliente.java:32)
	at com.company.imgestion.listener.AltaCliente.onBeforeInsert(AltaCliente.java:16)
	at com.haulmont.cuba.core.sys.listener.EntityListenerManager.fireListener(EntityListenerManager.java:203)
	at com.haulmont.cuba.core.sys.persistence.PersistenceImplSupport$OnCommitEntityVisitor.visit(PersistenceImplSupport.java:258)
	at com.haulmont.cuba.core.sys.persistence.PersistenceImplSupport.beforeStore(PersistenceImplSupport.java:143)
	at com.haulmont.cuba.core.sys.persistence.PersistenceImplSupport.traverseEntities(PersistenceImplSupport.java:130)
	at com.haulmont.cuba.core.sys.persistence.PersistenceImplSupport$ContainerResourceSynchronization.beforeCommit(PersistenceImplSupport.java:213)
	at org.springframework.transaction.support.TransactionSynchronizationUtils.triggerBeforeCommit(TransactionSynchronizationUtils.java:95)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.triggerBeforeCommit(AbstractPlatformTransactionManager.java:932)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:744)
	at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:730)
	at com.haulmont.cuba.core.sys.TransactionImpl.commit(TransactionImpl.java:83)
	at com.haulmont.cuba.core.app.DataManagerBean.commit(DataManagerBean.java:396)
	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.app.DataManagerBean$SecureDataManagerInvocationHandler.invoke(DataManagerBean.java:859)
	at com.sun.proxy.$Proxy306.commit(Unknown Source)
	at com.haulmont.cuba.core.app.DataServiceBean.commit(DataServiceBean.java:38)
	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:302)
	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:85)
	at com.haulmont.cuba.core.sys.ServiceInterceptor.aroundInvoke(ServiceInterceptor.java:74)
	at sun.reflect.GeneratedMethodAccessor86.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:620)
	at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:609)
	at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:68)
	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:208)
	at com.sun.proxy.$Proxy149.commit(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:84)
	at com.haulmont.cuba.web.sys.remoting.LocalServiceProxy$LocalServiceInvocationHandler.invoke(LocalServiceProxy.java:130)
	at com.sun.proxy.$Proxy23.commit(Unknown Source)
	at com.haulmont.cuba.client.sys.DataManagerClientImpl.commit(DataManagerClientImpl.java:95)
	at com.haulmont.cuba.gui.data.impl.GenericDataSupplier.commit(GenericDataSupplier.java:88)
	at com.haulmont.cuba.gui.data.impl.DsContextImpl.commit(DsContextImpl.java:164)
	at com.haulmont.cuba.gui.components.EditorWindowDelegate.commit(EditorWindowDelegate.java:255)
	at com.haulmont.cuba.web.gui.WebWindow$Editor.commitAndClose(WebWindow.java:1437)
	at com.haulmont.cuba.gui.components.AbstractEditor.commitAndClose(AbstractEditor.java:110)
	at com.haulmont.cuba.gui.components.EditorWindowDelegate$1.actionPerform(EditorWindowDelegate.java:78)
	at com.haulmont.cuba.web.gui.components.WebButton.performAction(WebButton.java:48)
	at com.haulmont.cuba.web.gui.components.WebButton$1.buttonClick(WebButton.java:39)
	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:508)
	at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:198)
	at com.vaadin.event.EventRouter.fireEvent(EventRouter.java:161)
	at com.vaadin.server.AbstractClientConnector.fireEvent(AbstractClientConnector.java:1030)
	at com.vaadin.ui.Button.fireClick(Button.java:377)
	at com.haulmont.cuba.web.toolkit.ui.CubaButton.fireClick(CubaButton.java:54)
	at com.vaadin.ui.Button$1.click(Button.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 com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:158)
	at com.vaadin.server.ServerRpcManager.applyInvocation(ServerRpcManager.java:118)
	at com.vaadin.server.communication.ServerRpcHandler.handleInvocations(ServerRpcHandler.java:414)
	at com.vaadin.server.communication.ServerRpcHandler.handleRpc(ServerRpcHandler.java:274)
	at com.vaadin.server.communication.UidlRequestHandler.synchronizedHandleRequest(UidlRequestHandler.java:79)
	at com.haulmont.cuba.web.sys.CubaVaadinServletService$CubaUidlRequestHandler.lambda$synchronizedHandleRequest$92(CubaVaadinServletService.java:307)
	at com.haulmont.cuba.web.sys.CubaVaadinServletService.withUserSession(CubaVaadinServletService.java:189)
	at com.haulmont.cuba.web.sys.CubaVaadinServletService$CubaUidlRequestHandler.synchronizedHandleRequest(CubaVaadinServletService.java:307)
	at com.vaadin.server.SynchronizedRequestHandler.handleRequest(SynchronizedRequestHandler.java:41)
	at com.vaadin.server.VaadinService.handleRequest(VaadinService.java:1409)
	at com.vaadin.server.VaadinServlet.service(VaadinServlet.java:369)
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.serviceAppRequest(CubaApplicationServlet.java:254)
	at com.haulmont.cuba.web.sys.CubaApplicationServlet.service(CubaApplicationServlet.java:163)
	at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at com.haulmont.cuba.web.sys.CubaHttpFilter.handleNotFiltered(CubaHttpFilter.java:108)
	at com.haulmont.cuba.web.sys.CubaHttpFilter.doFilter(CubaHttpFilter.java:95)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
	at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1099)
	at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:672)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
	at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
	at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
	at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
	at java.lang.Thread.run(Thread.java:745)

This is the lne of error :

LoadContext.createQuery(“select c from imgestion$Configuracion c”)));

This is strange, I cannot say what is the reason.
Could you provide a test project?

DataManager should work, but you can also use EntityManager here to read data in the same transaction.


TypedQuery<Configuracion> query = persistence.getEntityManager().createQuery("select c from imgestion$Configuracion c", Configuracion.class);
Configuracion config = query.getFirstResult();

Hi, with your code works, but i see the new row on table Configuracion, has not been created :frowning:

I’ve attached Screenshot of IDE.

Simply, i need if not exists General Config, created the first Registry in that table.


package com.company.imgestion.listener;

import com.company.imgestion.entity.Configuracion;
import com.company.imgestion.entity.Empresas;
import com.haulmont.cuba.core.Persistence;
import com.haulmont.cuba.core.TypedQuery;
import com.haulmont.cuba.core.global.DataManager;
import com.haulmont.cuba.core.global.LoadContext;
import com.haulmont.cuba.core.global.Metadata;
import org.springframework.stereotype.Component;
import com.haulmont.cuba.core.listener.BeforeInsertEntityListener;
import com.company.imgestion.entity.Clientes;

import javax.inject.Inject;
import java.util.List;

@Component("imgestion_AltaCliente")
public class AltaCliente implements BeforeInsertEntityListener<Clientes> {

    @Inject
    private Persistence persistence;

    @Inject
    private DataManager dataManager;

    @Inject
    private Metadata metadata;

    @Override
    public void onBeforeInsert(Clientes entity) {

        TypedQuery<Configuracion> query = persistence.getEntityManager().createQuery("select c from imgestion$Configuracion c", Configuracion.class);
        Configuracion config = query.getFirstResult();


        //List<Configuracion> config = dataManager.loadList(
        //        LoadContext.create(Configuracion.class).setQuery(
        //                LoadContext.createQuery("select c from imgestion$Configuracion c")));

        if (config == null) {
            Configuracion configuracion = metadata.create(Configuracion.class);
            configuracion.setContadorClientes(1);
            entity.setCodigo(1);
        } else {
            Integer count = config.getContadorClientes();
            count = count ++;
            config.setContadorClientes(count);
            entity.setCodigo(count);
        }
    }
}

ERROR

I attachProject.

When you go to create new Cliente, you see Codigo 999, then, when you save, exists EntityListener for Clientes, this Listener, get’s number on Table Configuration, and if not exists, creates a new registry.

New entity it’s not created :frowning:

SampleProject.zip (32.2K)

First, you forgot to persist the new instance of Configuracion. Second, be careful with ++ operation. Your statement count = count++ first assigns the old value of count, and then increments the variable, which is useless - count remains the same.
So the entity listener should look like this:

@Component("sampleproject_ClientesAlta")
public class ClientesAlta implements BeforeInsertEntityListener<Clientes> {

    @Inject
    Persistence persistence;

    @Inject
    Metadata metadata;

    @Override
    public void onBeforeInsert(Clientes entity) {
        TypedQuery<Configuracion> query = persistence.getEntityManager().createQuery("select c from sampleproject$Configuracion c", Configuracion.class);
        Configuracion config = query.getFirstResult();
        if (config == null) {
            Configuracion configuracion = metadata.create(Configuracion.class);
            configuracion.setContadorClientes(1);
            entity.setCodigo(1);
            persistence.getEntityManager().persist(configuracion);
        } else {
            Integer count = config.getContadorClientes();
            count = count + 1;
            config.setContadorClientes(count);
            entity.setCodigo(count);
        }
    }
}

The working project is attached.

SampleProject.zip (38.2K)

Perfect!!! Thanks!!