Hibernate Violação de Referência usando @ManytoOne

Bom dia Mestres!

Já li vários tópicos postados e não encontrei algo semelhante ao que estou passando.

Preciso fazer uma inclusão simples de Unidades de Medida (Metro (m), Quilometro(km), etc) e vincular ao Cliente que está operando o sistema no momento. Para o vinculo entre o Cliente e Unidade de Medida estou usando uma terceira entidade (ClienteUnidadeMedida) pois as Unidades só poderão ser acessadas, pelo cliente, as que forem cadastradas por ele mesmo ou previamente vinculadas a ele.

Minha Entidade Unidade está definida assim:

@Entity
@Table(name = "unidademedida")
public class UnidadeMedida implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(generator = "unicod_seq", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name = "unicod_seq", sequenceName = "unicod_seq", initialValue = 1, allocationSize = 1)
@Column(name = "id", nullable = false, updatable = false)
private Long id;

@ManyToOne
@JoinColumn(name="emg_id", nullable = false)
private EmpresaGestora empresaGestora;

@Column(name = "sundnome", nullable = false, length = 30)
private String sundnome;

@Column(name = "sundsigla", nullable = false, length = 10)
private String sundsigla;

@OneToMany(fetch = FetchType.LAZY, mappedBy="unidadeMedida", cascade = CascadeType.PERSIST)
private List<ClienteUnidadeMedida> unidadeMedidasCliente;

public List<ClienteUnidadeMedida> getUnidadeMedidasCliente() {
    if (unidadeMedidasCliente == null){
        unidadeMedidasCliente = new ArrayList<>();
    }
    
    return unidadeMedidasCliente;
}   

public void setUnidadeMedidasCliente(List<ClienteUnidadeMedida> unidadeMedidasCliente){
    this.unidadeMedidasCliente = unidadeMedidasCliente;
}


}

Minha entidade ClienteUnidadeMedida está assim:

@Entity
@Table(name="cliente_unidademedida")
public class ClienteUnidadeMedida implements Serializable {

private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(generator="cum_seq", strategy = GenerationType.SEQUENCE)
@SequenceGenerator(name="cum_seq", sequenceName = "cum_seq", initialValue = 1, allocationSize = 1)
@Column(name="cum_id", nullable = false, updatable = false)
private Long id;

@ManyToOne(optional = false)
@JoinColumn(name="unm_id", nullable = false)
private UnidadeMedida unidadeMedida;

@Column(name="cli_id")
private Long idCliente;
}

Minha rotina de gravação está

public UnidadeMedida salvar(UnidadeMedida unidadeMedida, Long idCliente) throws ISGTException {
        
        try{
            
                ClienteUnidadeMedida cum = new ClienteUnidadeMedida();
                cum.setIdCliente(idCliente);

                unidadeMedida.getUnidadeMedidasCliente().add(cum);
                UnidadeMedida um =  unidadeMedidaController.gravar(unidadeMedida);
           

        } catch(Exception ex){
            Logger.getLogger(UnidadeMedidaFacade.class.getName()).log(Level.SEVERE, null, ex);
            throw ex;
        }

    }

Meu gravar está definido assim:

    public boolean salvar(T obj) throws ISGTException{
        try {
            this.utx.begin(); // utx = @Resource private UserTransaction utx;
            this.entityManager.merge(obj);
            commit();
            return true;
        } catch (NotSupportedException | SystemException | ConstraintViolationException | PersistenceException e) {
            rollback();
            logger.error("---FALHA AO SALVAR REGISTRO (PERSIST)---", e);
            throw new ISGTException("---FALHA AO SALVAR REGISTRO---");
        }
    }

Acontece que ao processar está ocorrendo o seguinte erro:

Informações: Hibernate:

insert 
into
    cliente_unidademedida
    (cli_id, unm_id, cum_id) 
values
    (?, ?, ?)

WARN: SQL Error: 0, SQLState: 23502
ERROR: ERRO: valor nulo na coluna “unm_id” viola a restrição não-nula
Detalhe: Registro que falhou contém (7, 1, null).
Informações: HHH000010: On release of batch it still contained JDBC statements
Informações: RAR7115: Unable to set ClientInfo for connection
Advertência: DTX5014: Caught exception in beforeCompletion() callback:
javax.persistence.PersistenceException: org.hibernate.exception.ConstraintViolationException: could not execute statement
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1763)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1683)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl$CallbackExceptionMapperImpl.mapManagedFlushFailure(AbstractEntityManagerImpl.java:1882)
at org.hibernate.engine.transaction.synchronization.internal.SynchronizationCallbackCoordinatorNonTrackingImpl.beforeCompletion(SynchronizationCallbackCoordinatorNonTrackingImpl.java:115)
at org.hibernate.engine.transaction.synchronization.internal.RegisteredSynchronization.beforeCompletion(RegisteredSynchronization.java:50)
at com.sun.enterprise.transaction.JavaEETransactionImpl.commit(JavaEETransactionImpl.java:452)
at com.sun.enterprise.transaction.JavaEETransactionManagerSimplified.commit(JavaEETransactionManagerSimplified.java:854)
at com.sun.enterprise.transaction.UserTransactionImpl.commit(UserTransactionImpl.java:212)
at br.com.isgt.commons.controller.ISGTBean.commit(ISGTBean.java:43)
at br.com.isgt.commons.controller.ISGTBean.salvar(ISGTBean.java:70)
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:497)
at org.glassfish.ejb.security.application.EJBSecurityManager.runMethod(EJBSecurityManager.java:1081)
at org.glassfish.ejb.security.application.EJBSecurityManager.invoke(EJBSecurityManager.java:1153)
at com.sun.ejb.containers.BaseContainer.invokeBeanMethod(BaseContainer.java:4786)
at com.sun.ejb.EjbInvocation.invokeBeanMethod(EjbInvocation.java:656)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608)
at br.com.isgt.interceptors.InterceptorPersist.validateObject(InterceptorPersist.java:55)
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:497)
at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608)
at org.jboss.weld.ejb.AbstractEJBRequestScopeActivationInterceptor.aroundInvoke(AbstractEJBRequestScopeActivationInterceptor.java:64)
at org.jboss.weld.ejb.SessionBeanInterceptor.aroundInvoke(SessionBeanInterceptor.java:52)
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:497)
at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
at com.sun.ejb.EjbInvocation.proceed(EjbInvocation.java:608)
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.doCall(SystemInterceptorProxy.java:163)
at com.sun.ejb.containers.interceptors.SystemInterceptorProxy.aroundInvoke(SystemInterceptorProxy.java:140)
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:497)
at com.sun.ejb.containers.interceptors.AroundInvokeInterceptor.intercept(InterceptorManager.java:883)
at com.sun.ejb.containers.interceptors.AroundInvokeChainImpl.invokeNext(InterceptorManager.java:822)
at com.sun.ejb.containers.interceptors.InterceptorManager.intercept(InterceptorManager.java:369)
at com.sun.ejb.containers.BaseContainer.__intercept(BaseContainer.java:4758)
at com.sun.ejb.containers.BaseContainer.intercept(BaseContainer.java:4746)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandler.invoke(EJBLocalObjectInvocationHandler.java:212)
at com.sun.ejb.containers.EJBLocalObjectInvocationHandlerDelegate.invoke(EJBLocalObjectInvocationHandlerDelegate.java:88)
at com.sun.proxy.$Proxy248.salvar(Unknown Source)
at br.com.isgt.controller.UnidadeMedidaController.associarAoCliente(UnidadeMedidaController.java:121)
at br.com.isgt.facade.UnidadeMedidaFacade.salvar(UnidadeMedidaFacade.java:50)
at br.com.isgt.beans.BeanUnidadeMedida.salvar(BeanUnidadeMedida.java:48)
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:497)
at javax.el.ELUtil.invokeMethod(ELUtil.java:332)
at javax.el.BeanELResolver.invoke(BeanELResolver.java:537)
at javax.el.CompositeELResolver.invoke(CompositeELResolver.java:256)
at com.sun.el.parser.AstValue.invoke(AstValue.java:283)
at com.sun.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:304)
at org.jboss.weld.util.el.ForwardingMethodExpression.invoke(ForwardingMethodExpression.java:40)
at org.jboss.weld.el.WeldMethodExpression.invoke(WeldMethodExpression.java:50)
at com.sun.faces.facelets.el.TagMethodExpression.invoke(TagMethodExpression.java:105)
at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:147)
at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88)
at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:814)
at javax.faces.component.UICommand.broadcast(UICommand.java:300)
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:790)
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1282)
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81)
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101)
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:198)
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:658)
at org.apache.catalina.core.StandardWrapper.service(StandardWrapper.java:1682)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:318)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:160)
at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:734)
at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:673)
at com.sun.enterprise.web.WebPipeline.invoke(WebPipeline.java:99)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:174)
at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:416)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:283)
at com.sun.enterprise.v3.services.impl.ContainerMapper$HttpHandlerCallable.call(ContainerMapper.java:459)
at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:167)
at org.glassfish.grizzly.http.server.HttpHandler.runService(HttpHandler.java:206)
at org.glassfish.grizzly.http.server.HttpHandler.doHandle(HttpHandler.java:180)
at org.glassfish.grizzly.http.server.HttpServerFilter.handleRead(HttpServerFilter.java:235)
at org.glassfish.grizzly.filterchain.ExecutorResolver$9.execute(ExecutorResolver.java:119)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeFilter(DefaultFilterChain.java:283)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.executeChainPart(DefaultFilterChain.java:200)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.execute(DefaultFilterChain.java:132)
at org.glassfish.grizzly.filterchain.DefaultFilterChain.process(DefaultFilterChain.java:111)
at org.glassfish.grizzly.ProcessorExecutor.execute(ProcessorExecutor.java:77)
at org.glassfish.grizzly.nio.transport.TCPNIOTransport.fireIOEvent(TCPNIOTransport.java:536)
at org.glassfish.grizzly.strategies.AbstractIOStrategy.fireIOEvent(AbstractIOStrategy.java:112)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.run0(WorkerThreadIOStrategy.java:117)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy.access$100(WorkerThreadIOStrategy.java:56)
at org.glassfish.grizzly.strategies.WorkerThreadIOStrategy$WorkerThreadRunnable.run(WorkerThreadIOStrategy.java:137)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:591)
at org.glassfish.grizzly.threadpool.AbstractThreadPool$Worker.run(AbstractThreadPool.java:571)
at java.lang.Thread.run(Thread.java:745)

Detalhe, se eu gravo a Unidade de Medida sozinha ela funciona normalmente, agora se eu fizer a gravação do relacionamento não funciona.

Vi que o problema é o Id da minha Unidade de Medida, mas não sei o que fazer pra forçar o retorno desse Id pra eu usar no vinculo.

Já tentei de várias formas fazer essa configuração e até agora nada.

Desde já agradeço a atenção.
Abraço a todos.

Cara não está faltando o atributo referencedColumnName nesse mapeamento ai não ?

1 curtida

Sei que é meio antigo esse post, mas acho que posso ajudar, eu fiz um tópico sobre como utilizar o controle explícito de transações JTA por BMT (Bean Managed Transactions), utiliza o objeto UserTransacition.
Segue o link: http://www.tidicas.com.br/?p=319