2
Staff I have the following problem to persist a screen where I have a relationship of many to many, in the case groupTrabalho_employee, I have a screen that registers the working group and a picklist that registers the employees of the groupTrabalho.
However when trying to save the following error occurs:
org.hibernate.PersistentObjectException: detached entity passed to persist: br.gov.ro.portovelho.semfaz.sisfiscal.domain.Funcionario
What to do to fix this mistake?
My class Grupotrabalho:
package br.gov.ro.portovelho.semfaz.sisfiscal.domain;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToMany;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import org.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 Grupotrabalhomb:
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);
}
}
managed to resolve? the answer below helped?
– LeoCBS
Solved: To resolve I had to do as follows, in the Employee class I wrote down with @Lazycollection and changed arrayList to Set:
@LazyCollection(LazyCollectionOption.FALSE)
 @ManyToMany(mappedBy="funcionarios",fetch = FetchType.EAGER)
 private Set<GrupoTrabalho> gruposTrabalhos;
– Jackson Emmerich
Beware of Fetchtype.EAGER, as it will carry all objects
gruposTrabalhos
together with the Employee’s Referral, thereby increasing memory consumption.– LeoCBS