detached entity passed to persist

1

I have the following problem to persist a screen where I have a relationship from many to many, in the case of workgroup_function, I have a screen that registers the workgroup and a picklist that registers the employees of the group Work. src="https://i.stack.imgur.com/YT7nz.png">

Butwhentryingtosave,thefollowingerroroccurs:

org.hibernate.PersistentObjectException:detachedentitypassedtopersist:br.gov.ro.portovelho.semfaz.sisfiscal.domain.Funcionario

WhatcanIdotoresolvethiserror?

MyWorkgroupclass:

packagebr.gov.ro.portovelho.semfaz.sisfiscal.domain;importjava.io.Serializable;importjava.util.ArrayList;importjava.util.Date;importjava.util.List;importjavax.persistence.CascadeType;importjavax.persistence.Column;importjavax.persistence.Entity;importjavax.persistence.FetchType;importjavax.persistence.GeneratedValue;importjavax.persistence.GenerationType;importjavax.persistence.Id;importjavax.persistence.JoinColumn;importjavax.persistence.JoinTable;importjavax.persistence.ManyToMany;importjavax.persistence.Table;importjavax.persistence.Temporal;importjavax.persistence.TemporalType;importorg.hibernate.envers.Audited;@Audited@Entity@Table(schema="DBO")
public class GrupoTrabalho implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_grupoTrabalho")
    private Long id;

    @Column(name = "tx_nomeGrupo", nullable = false)
    private String nomeGrupo;

    @Column(name = "isAtivo")
    private boolean ativo;

    @Temporal(TemporalType.DATE)
    private Date dataCadastro = new Date();

    //cascade = {CascadeType.PERSIST, CascadeType.MERGE}
    @ManyToMany(cascade = {CascadeType.PERSIST, CascadeType.MERGE, CascadeType.DETACH}, fetch = FetchType.EAGER)
    @JoinTable(name = "grupoTrabalho_funcionarios", joinColumns = @JoinColumn(name = "grupoTrabalho_id"), 
        inverseJoinColumns = @JoinColumn(name = "funcionario_id"))
    private List<Funcionario> funcionarios = new ArrayList<Funcionario>(); 


    public GrupoTrabalho() {

    }

    public GrupoTrabalho(Long id) {
        this.id = id;
    }

    public GrupoTrabalho(String nomeGrupo, boolean ativo, Date dataCadastro) {
        super();
        this.nomeGrupo = nomeGrupo;
        this.ativo = ativo;
        this.dataCadastro = dataCadastro;
    }

    public GrupoTrabalho(String nomeGrupo, boolean ativo,
            Date dataCadastro, List<Funcionario> funcionarios) {
        super();
        this.nomeGrupo = nomeGrupo;
        this.ativo = ativo;
        this.dataCadastro = dataCadastro;
        this.funcionarios = funcionarios;
    }

    //getters and setters..




}

My Class Employee:

    package br.gov.ro.portovelho.semfaz.sisfiscal.domain;

import java.io.Serializable;
import java.util.List;

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.ManyToMany;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.validation.constraints.Min;

import org.hibernate.envers.Audited;
import org.hibernate.validator.constraints.Email;

import br.gov.frameworkdemoiselle.validation.annotation.Cpf;


@Audited    
@Entity
@Table(schema = "DBO")
public class Funcionario implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id_Funcionario")
    private Long id;

    @Cpf
    @Column(name = "tx_CPF")
    private String cpf;
    @Column(name = "tx_Nome")
    private String nome;
    @Min(value = 1,message = "Não pode ser zero")
    @Column(name = "nu_Matricula")
    private int matricula;
    @Email
    @Column(name = "tx_Email")
    private String email;
    @Column(name = "tx_Telefone",length = 15)
    private String telefone;

    @ManyToMany(mappedBy="funcionarios")
    private List<GrupoTrabalho> gruposTrabalhos;

    @ManyToOne
    @JoinColumn(name = "id_SitFuncionario_fk", nullable=false)
    private SitFuncionario sitFuncionario;


    @ManyToOne
    @JoinColumn(name = "id_cargo_FK",nullable=false)
    private Cargo cargo;

    @OneToOne
    @JoinColumn(name="id_Lotacao_FK",nullable=false)
    private Lotacao lotacao;

    @ManyToOne
    @JoinColumn(name = "id_FuncaoFuncionario_fk")
    private FuncaoFuncionario funcaoFuncionario;


    public Funcionario(){

    }

    public Funcionario(String cpf){
        this.cpf = cpf;

    }

    public Funcionario(Long id){
        this.id = id;

    }


    public Funcionario(String cpf, String nome, int matricula, String email,
            String telefone, SitFuncionario sitFuncionario, Cargo cargo,
            Lotacao lotacao, FuncaoFuncionario funcaoFuncionario, List<GrupoTrabalho> gruposTrabalhos) {
        super();
        this.cpf = cpf;
        this.nome = nome;
        this.matricula = matricula;
        this.email = email;
        this.telefone = telefone;
        this.sitFuncionario = sitFuncionario;
        this.cargo = cargo;
        this.lotacao = lotacao;
        this.funcaoFuncionario = funcaoFuncionario;
        this.gruposTrabalhos = gruposTrabalhos;
    }

    public Funcionario(String cpf, String nome, int matricula, String email,
            String telefone) {
        super();
        this.cpf = cpf;
        this.nome = nome;
        this.matricula = matricula;
        this.email = email;
        this.telefone = telefone;
    }

    getters and setters

My ManageBean Workgroup MB:

package br.gov.ro.portovelho.semfaz.sisfiscal.view;

import java.util.ArrayList;
import java.util.List;

import javax.inject.Inject;

import org.primefaces.event.TransferEvent;
import org.primefaces.model.DualListModel;

import br.gov.frameworkdemoiselle.annotation.PreviousView;
import br.gov.frameworkdemoiselle.stereotype.ViewController;
import br.gov.frameworkdemoiselle.template.AbstractEditPageBean;
import br.gov.frameworkdemoiselle.transaction.Transactional;
import br.gov.ro.portovelho.semfaz.sisfiscal.business.FuncionarioBC;
import br.gov.ro.portovelho.semfaz.sisfiscal.business.GrupoTrabalhoBC;
import br.gov.ro.portovelho.semfaz.sisfiscal.domain.Funcionario;
import br.gov.ro.portovelho.semfaz.sisfiscal.domain.GrupoTrabalho;

// To remove unused imports press: Ctrl+Shift+o

@ViewController
@PreviousView("./grupoTrabalho_list.jsf")
public class GrupoTrabalhoEditMB extends AbstractEditPageBean<GrupoTrabalho, Long> {

    private static final long serialVersionUID = 1L;

    @Inject
    private GrupoTrabalhoBC grupoTrabalhoBC;

    private DualListModel<Funcionario> funcionarioList;

    @Inject
    private FuncionarioBC funcionarioBC;

    public void setFuncionarioList(DualListModel<Funcionario> funcionarioList) {
        this.funcionarioList = funcionarioList;
    }

    public void addFuncionarioList(List<Funcionario> funcionarioList) {
        this.getBean().getFuncionarios().addAll(funcionarioList);
    }

    public void deleteFuncionarioList(List<Funcionario> funcionarioList) {
        this.getBean().getFuncionarios().removeAll(funcionarioList);
    }


    public DualListModel<Funcionario> getFuncionarioList() {
        if (this.funcionarioList == null) {
            List<Funcionario> source = funcionarioBC.findAll();
            List<Funcionario> target = this.getBean().getFuncionarios();

            if (source == null) {
                source = new ArrayList<Funcionario>();
            }
            if (target == null) {
                target = new ArrayList<Funcionario>();
            }else{
                source.removeAll(target);
            }
            this.funcionarioList = new DualListModel<Funcionario>(source, target);

        }
        return this.funcionarioList;
    }

    @SuppressWarnings("unchecked")
    public void onTransfer(TransferEvent event) {
        if (event.isAdd()){
            this.addFuncionarioList((List<Funcionario>) event.getItems());
        }
        if (event.isRemove()) {
            this.deleteFuncionarioList((List<Funcionario>) event.getItems());
         }
    } 

    @Override
    @Transactional
    public String delete() {

        this.grupoTrabalhoBC.delete(getId());
        return getPreviousView();
    }

    @Override
    @Transactional
    public String insert() {
        //TODO Náo está inserindo automaticamente a lista de muitos para muitos entre grupo e vários funcionários do grupo
        //this.getBean().setFuncionarios(null);
        this.grupoTrabalhoBC.insert(this.getBean());
        return getPreviousView();
    }

    @Override
    public String update() {
        //this.getBean().setFuncionarios(null);
        this.grupoTrabalhoBC.update(this.getBean());
        return getPreviousView();
    }

    @Override
    protected GrupoTrabalho handleLoad(Long id) {
        return this.grupoTrabalhoBC.load(id);
    }   
}
    
asked by anonymous 04.03.2015 / 15:44

1 answer

3

This error happens when you try to persist an object with the ID already filled, and the ID is auto incremental.

You can always, before persisting set to null the id, or try to merge, or use the method:

saveOrUpdate()
    
04.03.2015 / 15:50