ID como parte de inserções em massa

7 respostas
hibernate
V

Boa tarde!

Estou querendo inserir dados através de query, porém, o hibernate está retornando o erro abaixo!

Identifier generator reported it does not support implicit id handling as part of bulk insertions

Existe alguma configuração para isso?
Alguém sabe como resolver?

Obrigado!

7 Respostas

Lucas_Camara

Pelo erro, vc está inserindo registros em lote. Você está usando sequence para obter a PK?

V

Isso mesmo!

Lucas_Camara

Manda ae sua classe mapeada que vc está inserindo pra gente ver.

V

Lucas, boa noite!

Segue classes!

Desde já, Obrigado!

@Service(value = "fatDespesaLancamentoServico")
@Transactional
public class FatDespesaLancamentoServicoImp implements FatDespesaLancamentoServico {

    private static final long serialVersionUID = 0L;

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public void salvar(FatDespesaLancamento banco) {
        entityManager.merge(banco);
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<FatDespesaLancamento> listarTodos() {
        return entityManager.createQuery("from fat_despesa_lancamento").getResultList();
    }

    @SuppressWarnings("unchecked")
    @Override
    public List<FatDespesaLancamento> listarTodosAtivos() {
        return entityManager.createQuery("from fat_despesa_lancamento where status = '1' ").getResultList();
    }
    
    
    @SuppressWarnings("unchecked")
    @Override
    public List<FatDespesaLancamento> listarTodosPorProfissional(Integer id) {    
        try{
        return entityManager.createQuery("from fat_despesa_lancamento where id_profissional = :id ").setParameter("id", id).getResultList();
    	} catch (NoResultException e) {
			return null;
		}
	}
    

    @Override
    public void excluir(FatDespesaLancamento fatDespesaLancamento) {
        fatDespesaLancamento = entityManager.merge(fatDespesaLancamento);
        entityManager.remove(fatDespesaLancamento);
    }

    @Override
    public void deletar(FatDespesaLancamento fatDespesaLancamento) {
        fatDespesaLancamento.setDeletado("1");
        entityManager.merge(fatDespesaLancamento);
    }
    
        @Override
    public void gravarDespesaPreFatura() {
         String query = "insert into fat_despesa_vinculo (id, cancelado, status, cliente, caso, profissional, valor)"  
             + "select id, '2', status, cliente, caso, profissional, valor from fat_despesa_lancamento where id >= :id " ;
     System.out.println(query);  
        Query q = entityManager.createQuery(query)
         .setParameter("id", Long.valueOf(1))  ;           
   
     q.executeUpdate(); 
     
  
    }

}
@Entity(name = "fat_despesa_lancamento")
public class FatDespesaLancamento implements Serializable {

    private Long id;
    private String descricao;
    private Profissional profissional;
    private Profissional profissional_revisor;
    private Escritorio escritorio;
    private Cliente cliente;
    private Caso caso;
    private Moeda moeda;
    private Date data_inclusao = new Date();
    private Date data_despesa  = new Date();
    private float valor;
    private String status = "1";
    private String deletado  = "2";
    private FatPrefatura prefatura;
    private DespesaTipo despeda_tipo;

    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(columnDefinition = "int(12) ZEROFILL")
    public Long getId() {
        return id;
    }

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

    public String getDescricao() {
        return descricao;
    }

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

    public Date getData_inclusao() {
        return data_inclusao;
    }

    public void setData_inclusao(Date data_inclusao) {
        this.data_inclusao = data_inclusao;
    }

    public float getValor() {
        return valor;
    }

    public void setValor(float valor) {
        this.valor = valor;
    }

    @ManyToOne
    @JoinColumn(name = "id_profissional")
    public Profissional getProfissional() {
        return profissional;
    }

    public void setProfissional(Profissional profissional) {
        this.profissional = profissional;
    }

      @ManyToOne
    @JoinColumn(name = "id_profissional_revisor")
    public Profissional getProfissional_revisor() {
        return profissional_revisor;
    }

    public void setProfissional_revisor(Profissional profissional_revisor) {
        this.profissional_revisor = profissional_revisor;
    }

    
    @ManyToOne
    @JoinColumn(name = "id_escritorio")
    public Escritorio getEscritorio() {
        return escritorio;
    }

    public void setEscritorio(Escritorio escritorio) {
        this.escritorio = escritorio;
    }

    @ManyToOne
    @JoinColumn(name = "id_cliente")
    public Cliente getCliente() {
        return cliente;
    }

    public void setCliente(Cliente cliente) {
        this.cliente = cliente;
    }

    @ManyToOne
    @JoinColumn(name = "id_caso")
    public Caso getCaso() {
        return caso;
    }

    public void setCaso(Caso caso) {
        this.caso = caso;
    }

    @ManyToOne
    @JoinColumn(name = "id_moeda")
    public Moeda getMoeda() {
        return moeda;
    }

    public void setMoeda(Moeda moeda) {
        this.moeda = moeda;
    }

    public Date getData_despesa() {
        return data_despesa;
    }

    public void setData_despesa(Date data_despesa) {
        this.data_despesa = data_despesa;
    }

    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    public String getDeletado() {
        return deletado;
    }

    public void setDeletado(String deletado) {
        this.deletado = deletado;
    }

    
    @ManyToOne
    @JoinColumn(name = "id_prefatura")
    public FatPrefatura getPrefatura() {
        return prefatura;
    }

    public void setPrefatura(FatPrefatura prefatura) {
        this.prefatura = prefatura;
    }

        @ManyToOne
    @JoinColumn(name = "id_despesa_tipo")
    public DespesaTipo getDespeda_tipo() {
        return despeda_tipo;
    }

    public void setDespeda_tipo(DespesaTipo despeda_tipo) {
        this.despeda_tipo = despeda_tipo;
    }
    
    
    
    
  

    @Override
    public int hashCode() {
        int hash = 7;
        hash = 53 * hash + Objects.hashCode(this.id);
        return hash;
    }

    @Override
    public boolean equals(Object obj) {
        if (this == obj) {
            return true;
        }
        if (obj == null) {
            return false;
        }
        if (getClass() != obj.getClass()) {
            return false;
        }
        final FatDespesaLancamento other = (FatDespesaLancamento) obj;
        if (!Objects.equals(this.id, other.id)) {
            return false;
        }
        return true;
    }

}
Lucas_Camara

Uma dúvida: O ID da classe está marcada como SEQUENCE, mas não vi no código onde a sequence está definida. Qual banco está usando?

V

Boa tarde Lucas!

MySql!

Uma outra duvida:
Acho que consegui resolver alterando diretamente no banco para Auto Incremento, minha duvida é se isso prejudica a performance?

Obrigado!

Lucas_Camara

Pelo que conheço, fazer batch insert com auto incremento não eh uma boa combinação. O mais correto é utilizar sequence (ainda mais que há o recurso de cache de sequence)

Criado 1 de maio de 2020
Ultima resposta 9 de mai. de 2020
Respostas 7
Participantes 2