Insert de objeto demorando muito

Boa noite amigos tenho uma Classe produto que tem alguns relacionamentos como grupo, sub-grupo, unidade, marcas e etcs, quando vou incluir esse objeto na base de dados o mesmo verifica relacionamento para depois incluir o registro isso esta deixando o cadastro lento para finalização tem alguma forma de acelerar esse processo ?

jdbc,jpa,hibernate,está usando oque???

JPA com Hibernate

A melhor solução para estes casos e criar uma SP para inclusão.

Dá uma estudada em Cascade e veja se dá para mapear novamente as classes usando o que aprendeu.

Mesmo utilizando o cascade esta demorando para persistir
veja meu modelo

import java.io.Serializable;
import java.util.Calendar;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;


@Entity
@Table(name = "PRODUTO")
public class Produto implements Serializable{
    
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    @Column(name = "ID")
    private long id;
    @Column(name = "TIPO")
    private String tipo;
    @Column(name = "COMPOSTA")
    private boolean composta;
    @Column(name = "CODIGO")
    private String codigo;
    @Column(name = "REFERENCIA")
    private String referencia;
    @Column(name = "DESCRICAO")
    private String descricao;
    @Column(name = "PRECO_COMPRA")
    private double preco_compra;
    @Column(name = "LUCRO")
    private double lucro;
    @Column(name = "PRECO_VENDA")
    private double preco_venda;
    @Column(name = "GARANTIA")
    private int garantia;
    @Column(name = "CONVERSAO_UN")
    private boolean conversao_un;
    @Column(name = "DT_ALTERACAO")
    @Temporal(TemporalType.DATE)
    private Calendar dt_altercao;
    @Column(name = "DT_CADASTRO")
    @Temporal(TemporalType.DATE)
    private Calendar dt_cadastro;
    @ManyToOne(cascade = CascadeType.REFRESH)
    @JoinColumn(name = "IDFORNECEDOR")
    private Fornecedor fornecedor;
    @ManyToOne(cascade = CascadeType.REFRESH)
    @JoinColumn(name = "IDGRUPO_PRODUTO")
    private GrupoProduto grupo_produto;
    @ManyToOne(cascade = CascadeType.REFRESH)
    @JoinColumn(name = "IDSUBGRUPO_PRODUTO")
    private SubgrupoProduto subgrupo_produto;
    @ManyToOne(cascade = CascadeType.REFRESH)
    @JoinColumn(name = "IDMARCA_PRODUTO")
    private MarcaProduto marca_produto;
    @ManyToOne(cascade = CascadeType.REFRESH)
    @JoinColumn(name = "IDNCM")
    private Ncm ncm;
    @ManyToOne(cascade = CascadeType.REFRESH)
    @JoinColumn(name = "IDUNIDADE")
    private Unidade unidade;
    @Column(name = "ESTADO")
    private boolean estado;
    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public String getTipo() {
        return tipo;
    }

    public void setTipo(String tipo) {
        this.tipo = tipo;
    }

    public boolean isComposta() {
        return composta;
    }

    public void setComposta(boolean composta) {
        this.composta = composta;
    }

    public String getCodigo() {
        return codigo;
    }

    public void setCodigo(String codigo) {
        this.codigo = codigo;
    }

    public String getReferencia() {
        return referencia;
    }

    public void setReferencia(String referencia) {
        this.referencia = referencia;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

   

    public double getLucro() {
        return lucro;
    }

    public void setLucro(double lucro) {
        this.lucro = lucro;
    }

    public double getPreco_venda() {
        return preco_venda;
    }

    public void setPreco_venda(double preco_venda) {
        this.preco_venda = preco_venda;
    }

    public int getGarantia() {
        return garantia;
    }

    public void setGarantia(int garantia) {
        this.garantia = garantia;
    }

    public boolean isConversao_un() {
        return conversao_un;
    }

    public void setConversao_un(boolean conversao_un) {
        this.conversao_un = conversao_un;
    }

    public Calendar getDt_altercao() {
        return dt_altercao;
    }

    public void setDt_altercao(Calendar dt_altercao) {
        this.dt_altercao = dt_altercao;
    }

    public Calendar getDt_cadastro() {
        return dt_cadastro;
    }

    public void setDt_cadastro(Calendar dt_cadastro) {
        this.dt_cadastro = dt_cadastro;
    }

    public Fornecedor getFornecedor() {
        return fornecedor;
    }

    public void setFornecedor(Fornecedor fornecedor) {
        this.fornecedor = fornecedor;
    }

    public GrupoProduto getGrupo_produto() {
        return grupo_produto;
    }

    public void setGrupo_produto(GrupoProduto grupo_produto) {
        this.grupo_produto = grupo_produto;
    }

    public SubgrupoProduto getSubgrupo_produto() {
        return subgrupo_produto;
    }

    public void setSubgrupo_produto(SubgrupoProduto subgrupo_produto) {
        this.subgrupo_produto = subgrupo_produto;
    }

    public MarcaProduto getMarca_produto() {
        return marca_produto;
    }

    public void setMarca_produto(MarcaProduto marca_produto) {
        this.marca_produto = marca_produto;
    }

    public Ncm getNcm() {
        return ncm;
    }

    public void setNcm(Ncm ncm) {
        this.ncm = ncm;
    }

    public Unidade getUnidade() {
        return unidade;
    }

    public void setUnidade(Unidade unidade) {
        this.unidade = unidade;
    }  

    public boolean isEstado() {
        return estado;
    }

    public void setEstado(boolean estado) {
        this.estado = estado;
    }

    public double getPreco_compra() {
        return preco_compra;
    }

    public void setPreco_compra(double preco_compra) {
        this.preco_compra = preco_compra;
    }
    
    
}

Esta demorando 19.174 Segundos para efetuar o insert pois ele verifica cada tabela que tem relacionamento.

esta fazendo todo esse processo para depois persistir


Hibernate: 
    select
        fornecedor0_.ID as ID348_,
        fornecedor0_.BAIRRO as BAIRRO348_,
        fornecedor0_.CELULAR as CELULAR348_,
        fornecedor0_.CEP as CEP348_,
        fornecedor0_.IDCIDADE as IDCIDADE348_,
        fornecedor0_.CPF_CNPJ as CPF5_348_,
        fornecedor0_.DT_ALTERACAO as DT6_348_,
        fornecedor0_.DT_CADASTRO as DT7_348_,
        fornecedor0_.EMAIL as EMAIL348_,
        fornecedor0_.ESTADO as ESTADO348_,
        fornecedor0_.NOME as NOME348_,
        fornecedor0_.NUMERO as NUMERO348_,
        fornecedor0_.OBSERVACAO as OBSERVACAO348_,
        fornecedor0_.RG_IE as RG13_348_,
        fornecedor0_.RUA as RUA348_,
        fornecedor0_.TELEFONE as TELEFONE348_,
        fornecedor0_.TIPO as TIPO348_ 
    from
        FORNECEDOR fornecedor0_ 
    where
        fornecedor0_.ID=6 limit ?
Hibernate: 
    select
        cidade0_.ID as ID358_1_,
        cidade0_.CEP as CEP358_1_,
        cidade0_.IDESTADO as IDESTADO358_1_,
        cidade0_.IBGE as IBGE358_1_,
        cidade0_.NOME as NOME358_1_,
        estado1_.ID as ID352_0_,
        estado1_.IBGE as IBGE352_0_,
        estado1_.ICMS as ICMS352_0_,
        estado1_.IPI as IPI352_0_,
        estado1_.NOME as NOME352_0_,
        estado1_.SIGLA as SIGLA352_0_ 
    from
        CIDADE cidade0_ 
    left outer join
        ESTADO estado1_ 
            on cidade0_.IDESTADO=estado1_.ID 
    where
        cidade0_.ID=?


Hibernate: 
    select
        grupoprodu0_.ID as ID421_,
        grupoprodu0_.NOME as NOME421_ 
    from
        GRUPO_PRODUTO grupoprodu0_ 
    where
        grupoprodu0_.ID=6 limit ?


Hibernate: 
    select
        subgrupopr0_.ID as ID489_,
        subgrupopr0_.IDGRUPO_PRODUTO as IDGRUPO3_489_,
        subgrupopr0_.NOME as NOME489_ 
    from
        SUBGRUPO_PRODUTO subgrupopr0_ 
    where
        subgrupopr0_.ID=9 limit ?
Hibernate: 
    select
        grupoprodu0_.ID as ID479_0_,
        grupoprodu0_.NOME as NOME479_0_ 
    from
        GRUPO_PRODUTO grupoprodu0_ 
    where
        grupoprodu0_.ID=?

Hibernate: 
    select
        marcaprodu0_.ID as ID545_,
        marcaprodu0_.NOME as NOME545_ 
    from
        MARCA_PRODUTO marcaprodu0_ 
    where
        marcaprodu0_.ID=16 limit ?


Hibernate: 
    select
        ncm0_.ID as ID607_,
        ncm0_.CODIGO as CODIGO607_,
        ncm0_.DESCRICAO as DESCRICAO607_ 
    from
        NCM ncm0_ 
    where
        ncm0_.ID=1 limit ?


Hibernate: 
    select
        unidade0_.ID as ID644_,
        unidade0_.CODIGO as CODIGO644_,
        unidade0_.NOME as NOME644_ 
    from
        UNIDADE unidade0_ 
    where
        unidade0_.ID=1 limit ?
Salvando...
Hibernate: 
    insert 
    into
        PRODUTO
        (CODIGO, COMPOSTA, CONVERSAO_UN, DESCRICAO, DT_ALTERACAO, DT_CADASTRO, ESTADO, IDFORNECEDOR, GARANTIA, IDGRUPO_PRODUTO, LUCRO, IDMARCA_PRODUTO, IDNCM, PRECO_COMPRA, PRECO_VENDA, REFERENCIA, IDSUBGRUPO_PRODUTO, TIPO, IDUNIDADE) 
    values
        (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
19.174 Segundos

Dá uma estudada em Cascade e veja qual é o melhor para os seus relacionamentos usando o que aprendeu.

Quando você cadastra um produto, irá atualizar o fornecedor? Precisa atualizar um grupo ou subgrupo?

Não preciso somente cadastrar o produto as outras entidades é somente para relacionamento.