Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Erro ao salvar filho de uma classe

Analisando passo a passo pelo debug, o objeto arquivoImagem, está preenchido.

Mapeamento pai para filho:

    @NotAudited
        @OneToMany(mappedBy = "contaPagarReceber", cascade = {CascadeType.PERSIST,
                CascadeType.MERGE, CascadeType.DETACH})
        public Set<ContaPagarReceberArquivoImagemEntity> getContasPagarReceberArquivosImagens() {
            return contasPagarReceberArquivosImagens;
        }

Preeenchimento

    Set<ContaPagarReceberArquivoImagemEntity> cprai = new LinkedHashSet<>();
            for (ContaPagarReceberArquivoImagemEntity arqImg : entidade.getContasPagarReceberArquivosImagens()) {
                aplicacaoAuditoria(arqImg);
                if(entidadeGravar instanceof ContaPagarEntity){
                    arqImg.setContaPagarReceber((ContaPagarEntity) entidadeGravar);
                } else {
                    arqImg.setContaPagarReceber((ContaReceberEntity) entidadeGravar);
                }
                arqImg.setArquivoImagem(arqImg.getArquivoImagem());
                cprai.add(arqImg);
            }
            entidadeGravar.setContasPagarReceberArquivosImagens(cprai);

Método genérico de persist

    private void persist(Object objeto) throws Exception {
            EntityManager em = JPAUtility.getEntityManager();
            try {
                EntityTransaction et = em.getTransaction();
                try {
                    ((Session) em.getDelegate()).setDefaultReadOnly(false);
                    et.begin();
                    em.detach(objeto);
                    em.persist(objeto);
                    em.flush();
                    et.commit();
                } catch (PersistenceException e) {
                    trataErrosDePersistenciaAntes(em, e);
                    et.rollback();
                } catch (Exception e) {
                    et.rollback();
                    throw new RuntimeExceptionDao(e);
                } finally {
                    ((Session) em.getDelegate()).setDefaultReadOnly(true);
                }
            } finally {
                em.close();
            }
        }

Erro:

    08:26:42,119 WARN  [org.hibernate.action.internal.UnresolvedEntityInsertActions] (default task-16) HHH000437: Attempting to save one or more entities that have a non-nullable association with an unsaved transient entity. The unsaved transient entity must be saved in an operation prior to saving these dependent entities.
        Unsaved transient entity: ([br.eti.netsoft.erp.modelo.arquivoimagem.ArquivoImagemEntity#<null>])
        Dependent entities: ([[br.eti.netsoft.erp.modelo.financeiro.ContaPagarReceberArquivoImagemEntity#511c085f-165f-4438-a3ce-e4fe1a1d3c05]])
        Non-nullable association(s): ([br.eti.netsoft.erp.modelo.financeiro.ContaPagarReceberArquivoImagemEntity.arquivoImagem])
    08:26:42,119 WARN  [org.hibernate.action.internal.UnresolvedEntityInsertActions] (default task-16) HHH000437: Attempting to save one or more entities that have a non-nullable association with an unsaved transient entity. The unsaved transient entity must be saved in an operation prior to saving these dependent entities.
        Unsaved transient entity: ([br.eti.netsoft.erp.modelo.arquivoimagem.ArquivoImagemEntity#<null>])
        Dependent entities: ([[br.eti.netsoft.erp.modelo.financeiro.ContaPagarReceberArquivoImagemEntity#151decc8-73cb-4b8b-a278-35c2bfd08902]])
        Non-nullable association(s): ([br.eti.netsoft.erp.modelo.financeiro.ContaPagarReceberArquivoImagemEntity.arquivoImagem])
    08:26:42,120 ERROR [br.eti.netsoft.dao.GHDAO] (default task-16) Erro  ao gravar objeto: br.eti.netsoft.dao.exception.RuntimeExceptionDao: java.lang.IllegalStateException: org.hibernate.TransientPropertyValueException: Not-null property references a transient value - transient instance must be saved before current operation : br.eti.netsoft.erp.modelo.financeiro.ContaPagarReceberArquivoImagemEntity.arquivoImagem -> br.eti.netsoft.erp.modelo.arquivoimagem.ArquivoImagemEntity

O que pode ser este erro ?

3 respostas
solução!

Antes de persistir o ContaPagarReceberArquivoImagemEntity no banco de dados, tente persistir o ArquivoImagemEntity.

Olá Guilherme,

acredito que o Otávio tem razão... não identifiquei nos seus códigos a chamada do metodo persist. Porém, fazendo a leitura do erro fica evidente que o objeto "ArquivoImagemEntity" não foi persistido e que o objeto "ContaPagarReceberArquivoImagemEntity" possui um objeto "ArquivoImagemEntity" ao qual ainda não foi persistido e não pode ser nulo; tanto que a referência "Non-nullable association(s): ([br.eti.netsoft.erp.modelo.financeiro.ContaPagarReceberArquivoImagemEntity.arquivoImagem])" deixa explicito isso.

Sim, foi isto.

Obrigado

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software