Erro Hibernate com mapeamento ManyToMany

34 respostas
J

Pessoal,

Estou tentando inserir no BD um objeto com relacionamento ManyToMany, mas não estou conseguindo, espero que possam me ajudar.

Criei as duas tabelas no BD e depois a tabela associtativa, junto com as foreign keys.

Depois modelei as duas classes em java, adicionando as anotações do relacionamento m:n que surgiu.
Porém na hora de inserir, se eu seto todos os dados do objeto Ferias e depois coloco esse objeto na coleção ferias da classe Colaborador, nada acontece, só mostra um erro dizendo que não consegue salvar no BD, apenas isso.
Se eu faço ao contrário, seto o colaborador com os dados recuperados do BD com o ID dele e depois jogo esse objeto colaborador dentro da coleção da classe Férias, dá o seguinte erro: object references an unsaved transient instance - save the transient instance before flushing: catalogo.modelo.Ferias

Não sei o que pode ser, já mexi no BD, no xml do Hibernate, já testei de varias maneiras, já setei a o objeto ferias depois colaborador e nada até agora, se algume puder me ajudar, agradeço.

Classe COLABORADOR:

...
@Entity
@Table(name = "colaborador", schema = "catalogo")
@Inheritance(strategy = InheritanceType.JOINED)
public class Colaborador implements Serializable
{
   ...
   @ManyToMany(fetch=FetchType.EAGER) 
   @JoinTable(name="colaborador_ferias", schema="catalogo", 
               joinColumns=@JoinColumn(name="id_colaborador"), 
               inverseJoinColumns=@JoinColumn(name="id_ferias")) 
   @Fetch(FetchMode.JOIN)
   @Cascade(CascadeType.ALL)
   private Collection<Ferias> ferias; 

   ...
   public Collection<Ferias> getFerias() {
        return ferias;
    }

    public void setFerias(Collection<Ferias> ferias) {
        this.ferias = ferias;
    }  
...
}

Classe FERIAS:

...
@Entity
@Table(name = "ferias", schema = "catalogo")
public class Ferias implements Serializable
{
  ...
  @ManyToMany(fetch=FetchType.LAZY) 
  @JoinTable(name="colaborador_ferias", schema="catalogo", 
               joinColumns={@JoinColumn(name="id_ferias")}, 
               inverseJoinColumns={@JoinColumn(name="id_colaborador")}) 
  @Fetch(FetchMode.JOIN)
  @Cascade(CascadeType.ALL)
  private Collection<Colaborador> colaboradores;

  public Collection<Colaborador> getColaboradores() {
        return colaboradores;
    }

    public void setColaboradores(Collection<Colaborador> colaboradores) {
        this.colaboradores = colaboradores;
    }   
...
}

ACTION

...

FeriasForm feriasForm = (FeriasForm)form;
        
        Colaborador colaborador = new Colaborador();                
        Ferias ferias = new Ferias();
                
        int idColaborador = Integer.parseInt(feriasForm.getIdColaborador());
        GenericDAO colaboradorDao = new GenericDAO(Colaborador.class);
        colaborador = (Colaborador) colaboradorDao.carregarPeloId(idColaborador);        
        
        ferias.setTipo(feriasForm.getTipo());
        ferias.setExercicio(feriasForm.getExercicio());
        ferias.setPeriodo1(feriasForm.getPeriodo1());
        ferias.setInicio1(ConverterData.converteData(feriasForm.getInicio1()));        
        ferias.setPeriodo2(feriasForm.getPeriodo2());
        ferias.setInicio2(ConverterData.converteData(feriasForm.getInicio2()));        
        ferias.setObs(feriasForm.getObs());
        
        /*ferias.setColaboradores(new ArrayList<Colaborador>()); 
        ferias.getColaboradores().add(colaborador);*/
        
        colaborador.setFerias(new ArrayList<Ferias>());
        colaborador.getFerias().add(ferias);        
        
        
        /*int idColaborador = Integer.parseInt(feriasForm.getIdColaborador());
        GenericDAO colaboradorDao = new GenericDAO(Colaborador.class);
        colaborador = (Colaborador) colaboradorDao.carregarPeloId(idColaborador);        
        //ferias.setColaborador(colaborador);
        ferias.setColaboradores(new ArrayList<Colaborador>()); 
        ferias.getColaboradores().add(colaborador);*/
        
        GenericDAO dao = new GenericDAO(Ferias.class);               
        
        try {
            dao.salvar(colaborador);
            retorno = "sucesso";
            msg = "As f&eacute;rias do funcion&aacute;rio foram cadastradas com sucesso!";
        } 
        catch (Exception e) {
            retorno = "erro";
            msg = "N&atilde;o foi poss&iacute;vel salvar as f&eacute;rias do funcion&aacute;rio!" + e.getMessage().toString();
        }

...

34 Respostas

A

cara,

como seu mapeamento é bidirecional, vc tem que fazer o seguinte

colaborador.setFerias(new ArrayList<Ferias>());  
colaborador.getFerias().add(ferias);

ferias.setColaborador(new ArrayList<Colaborador>());
ferias.getColaborador()add(colaborador);

t+

J

Alisson,

Fiz o que voce falou, setei tambem a coleção de colaboradores na classe ferias. Agora deu o mesmo erro que dava quando eu tentava inserir setando o objeto Ferias (fazendo ao contrario do que está codificado acima).
O erro mostrado é apenas esse:

could not insert: [catalogo.modelo.Ferias]

A

cara,

posta o erro completo ai

J

Só apareceu esse.
Como mostro o erro todo?

A

no seu catch, coloque e.printStackTrace(); e poste aqui.

J

Hoje em dia, faço assim:

msg = "N&atilde;o foi poss&iacute;vel salvar as f&eacute;rias do funcion&aacute;rio!" + e.getMessage().toString();

Quando coloco essa linha:

e.printStackTrace();

Não mostra nada e o NetBeans ainda fala que eu devo remover essa linha com o printStackTrace
Como faço dentro do try e catch para mostrar o erro completo?

A

cara, vc tem que fazer assim

catch (Exception e) {  
            retorno = "erro";  
            msg = "Não foi possível salvar as férias do funcionário!" + e.getMessage().toString();  
            e.printStackTrace();
        }
J

Coloquei assim (como já havia feito anteriormente):

catch (Exception e) { retorno = "erro"; msg = "Não foi possível salvar as férias do funcionário!" + e.getMessage().toString(); e.printStackTrace(); }

E continua mostrando apenas isso:

Não foi possível salvar as férias do funcionário!could not insert: [catalogo.modelo.Ferias]

A

cara,
estranho isso, faz um debug ai e ve pq nao está sendo mostrado o log de erro.

t+

J

Alisson,

Nada, infelizmente. Depurei e não aconteceu nada tambem, só se fiz errado.

A

cara,

tem logica isso não, tem algo errado ai. pq sem ele log, nao tem como te ajudar

J

Não tem outra maneira de eu ver o erro completo nao?

A

faz o seguinte, coloca um breakponit no seu catch, e qdo ele entrar nele, verifique o conteudo da variavel do objeto Exception.

J

Já fiz isso, mas não consegui continuar a depuração, vou tentar de novo aqui…

J

A unica coisa que consegui foi isso:

org.hibernate.exception.GenericJDBCException: could not insert: [catalogo.modelo.Ferias]

Só aparece isso como valor da variavel na linha que dei breakpoint

A

é cara, essa sua aplicação ta extraissimaaaa. pq sem saber o log de erro, fica dificil de te ajudar

A

cara,

fiz um exemplo para te ajudar, segue ai

import java.io.Serializable;
import javax.persistence.*;
import java.util.List;


/**
 * The persistent class for the table1 database table.
 * 
 */
@Entity
@Table(name="table1")
public class Table1 implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int idtable1;

	private String descricao;

	//bi-directional many-to-many association to Table2
	@ManyToMany(mappedBy="table1s", cascade = CascadeType.ALL)
	private List<Table2> table2s;

    public Table1() {
    }

	public int getIdtable1() {
		return this.idtable1;
	}

	public void setIdtable1(int idtable1) {
		this.idtable1 = idtable1;
	}

	public String getDescricao() {
		return this.descricao;
	}

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

	public List<Table2> getTable2s() {
		return this.table2s;
	}

	public void setTable2s(List<Table2> table2s) {
		this.table2s = table2s;
	}
	
}
import java.io.Serializable;
import javax.persistence.*;
import java.util.List;


/**
 * The persistent class for the table2 database table.
 * 
 */
@Entity
@Table(name="table2")
public class Table2 implements Serializable {
	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy=GenerationType.IDENTITY)
	private int idtable2;

	private String descricao;

	//bi-directional many-to-many association to Table1
    @ManyToMany(cascade = CascadeType.ALL)
	@JoinTable(name="table1table2", 
			   joinColumns={@JoinColumn(name="idtable2")}, 
			   inverseJoinColumns={@JoinColumn(name="idtable1")})
	private List<Table1> table1s;

    public Table2() {
    }

	public int getIdtable2() {
		return this.idtable2;
	}

	public void setIdtable2(int idtable2) {
		this.idtable2 = idtable2;
	}

	public String getDescricao() {
		return this.descricao;
	}

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

	public List<Table1> getTable1s() {
		return this.table1s;
	}

	public void setTable1s(List<Table1> table1s) {
		this.table1s = table1s;
	}
	
}
public class Teste {
	public static void main(String[] args) {
		EntityManager entityManager = Persistence.createEntityManagerFactory("bingo").createEntityManager();
		
		Table1 table1 = new Table1();
		table1.setDescricao("teste1");
		table1.setTable2s(new ArrayList<Table2>());
		
		Table2 table2 = new Table2();
		table2.setDescricao("teste2");
		table2.setTable1s(new ArrayList<Table1>());
		
		table1.getTable2s().add(table2);
		table2.getTable1s().add(table1);
		
		entityManager.getTransaction().begin();
		entityManager.persist(table1);
		entityManager.getTransaction().commit();
        }
}

PS: coloca o jar do log4j que ele pode te ajudar a mostrar o log de erro.

t+

J

Alterei algumas coisas, seguindo o exemplo que voce deu e nao funcinou tambem. Estou tentando colocar o log4j para rodar aqui, se conseguir eu posto.

COLABORADOR:

@ManyToMany(mappedBy = "colaboradores", cascade = javax.persistence.CascadeType.ALL) private List<Ferias> ferias;

FERIAS:

@ManyToMany(cascade = CascadeType.ALL) @JoinTable(name="colaborador_ferias", schema = "catalogo", joinColumns={@JoinColumn(name="id_ferias")}, inverseJoinColumns={@JoinColumn(name="id_colaborador")}) private List<Colaborador> colaboradores;

ACTION:

FeriasForm feriasForm = (FeriasForm)form;
        
        Colaborador colaborador = new Colaborador();                
        Ferias ferias = new Ferias();
                
        /*int idColaborador = Integer.parseInt(feriasForm.getIdColaborador());
        GenericDAO colaboradorDao = new GenericDAO(Colaborador.class);
        colaborador = (Colaborador) colaboradorDao.carregarPeloId(idColaborador);    */
        colaborador.setId(52);
        colaborador.setFerias(new ArrayList<Ferias>());
        
        ferias.setTipo(feriasForm.getTipo());
        ferias.setExercicio(feriasForm.getExercicio());
        ferias.setPeriodo1(feriasForm.getPeriodo1());
        ferias.setInicio1(ConverterData.converteData(feriasForm.getInicio1()));        
        ferias.setPeriodo2(feriasForm.getPeriodo2());
        ferias.setInicio2(ConverterData.converteData(feriasForm.getInicio2()));        
        ferias.setObs(feriasForm.getObs());
        ferias.setColaboradores(new ArrayList<Colaborador>()); 
        
        /*ferias.setColaboradores(new ArrayList<Colaborador>()); 
        ferias.getColaboradores().add(colaborador);*/
                
        colaborador.getFerias().add(ferias);                         
        ferias.getColaboradores().add(colaborador); 
        
        
        /*int idColaborador = Integer.parseInt(feriasForm.getIdColaborador());
        GenericDAO colaboradorDao = new GenericDAO(Colaborador.class);
        colaborador = (Colaborador) colaboradorDao.carregarPeloId(idColaborador);        
        //ferias.setColaborador(colaborador);
        ferias.setColaboradores(new ArrayList<Colaborador>()); 
        ferias.getColaboradores().add(colaborador);*/
        
        GenericDAO dao = new GenericDAO(Ferias.class);               
        
        try {
            dao.salvar(colaborador);
            retorno = "sucesso";
            msg = "As f&eacute;rias do funcion&aacute;rio foram cadastradas com sucesso!";
        } 
        catch (Exception e) {                     
            retorno = "erro";    
            msg = "Não foi possível salvar as férias do funcionário! " + e.getMessage().toString();    
            e.printStackTrace();  
        }

BANCO DE DADOS
tab_ferias
id_ferias
periodo
ano

tab_colaborador
id_colaborador
dados do colaborador …

tab_colaborador_ferias
id_colaborador
id_ferias

Acho que está tudo certo né? Banco de dados e as classes?

Vou tentar ver o que está acontecendo com o0 log4j

A

cara,

o problema deve ser o seguinte, no exemplo q eu te passei, qdo se faz o insert, ele faz insert nas duas entidades e no seu caso vc quer trazer um colaborador que ja existe e vincular a ferias, nesse caso deve ser diferente o mapeamento.

coloca o log4j ai e ve o erro q vai da, q eu vou fazer um teste aqui no exemplo q eu te passei.

t+

A

cara,

fiz um teste aqui e funcionou, so fiz um pequena alteração no meu codigo, segue

@ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)    
   @JoinTable(name="colaborador_ferias", schema = "catalogo",   
              joinColumns={@JoinColumn(name="id_ferias")},     
              inverseJoinColumns={@JoinColumn(name="id_colaborador")})    
   private List<Colaborador> colaboradores;

ai fiz uma pesquisa no banco, fiz o relacionamento das entidades e inseriu normal.

t+

J

Nesse teste que fez você apenas adicionou o fetch type né? Na classe Colaborador ou Table 1, pelo seu exemplo, voce nao alterou nada né?

Aqui eu adicionei o fetchtype na classe férias e tambem não funcionou, não sei mesmo o que pode ser. Ainda não consegui colocar o log4j para rodar aqui, não esta salvando nada no arquivo de log, vou continuar tentando aqui.

Valeu mesmo pela ajuda

A

cara,

vc pode colocar o fetch nas duas entidades que nao vai fazer diferenca, vc nao tem mais entidades relacionadas com suas entidades ferias e coloborador, faz o seguinte, posta a sua classe ferias e coloborador completa.

t+

J
COLABORADOR:
package catalogo.modelo;

import java.io.Serializable;
import java.util.Date;
import java.util.List;
import javax.persistence.*;
import org.hibernate.annotations.Cascade;
import org.hibernate.annotations.CascadeType;
import org.hibernate.annotations.Fetch;
import org.hibernate.annotations.FetchMode;

@Entity
@Table(name = "colaborador", schema = "catalogo")
@Inheritance(strategy = InheritanceType.JOINED)
public class Colaborador implements Serializable
{
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id_colaborador")
    private int id;
    
    @Column(name="nome")
    private String nome;
    
    @Column(name="data_nascimento")
    @Temporal(TemporalType.DATE)
    private Date dataNascimento;
    
    @Column(name="naturalidade")
    private String naturalidade;
    
    @Column(name="nacionalidade")
    private String nacionalidade;
    
    @Column(name="sexo")
    private String sexo;
    
    @Column(name="tipo_sanguineo")
    private String tipoSanguineo;
    
    @Column(name="fator_rh")
    private String fatorRh;
    
    @Column(name="pai")
    private String pai;
    
    @Column(name="mae")
    private String mae;
    
    @Column(name="estado_civil")
    private String estadoCivil;
    
    @Column(name="conjuge")
    private String conjuge;
    
    @Column(name="dependentes")
    private String dependentes;    

    @OneToOne
    @JoinColumn(name = "id_endereco", referencedColumnName = "id_endereco", insertable = true, updatable = true)
    @Cascade(CascadeType.ALL)
    private Endereco endereco;
    
    @Column(name="telefone1")
    private String telefone1;
    
    @Column(name="telefone2")
    private String telefone2;
    
    @Column(name="celular1")
    private String celular1;
    
    @Column(name="celular2")
    private String celular2;
    
    @Column(name="email_pessoal")
    private String emailPessoal;
    
    @Column(name="email_institucional")
    private String emailInstitucional;
    
    @Column(name="rg")
    private String rg;
    
    @Column(name="orgao_expedidor")
    private String orgaoExpedidor;
    
    @Column(name="expedicao_rg")
    @Temporal(TemporalType.DATE)
    private Date expedicaoRg;
    
    @Column(name="cpf")
    private String cpf;
    
    @Column(name="titulo_eleitoral")
    private String tituloEleitoral;
    
    @Column(name="pis_pasep")
    private String pisPasep;
    
    @Column(name="conselho_classe")
    private String conselhoClasse;
    
    @Column(name="data_admissao")
    @Temporal(value=javax.persistence.TemporalType.DATE)
    private Date dataAdmissao;
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "id_instituicao", referencedColumnName = "id_instituicao", insertable = true, updatable = true)
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.PERSIST)
    private Instituicao instituicao;
    
    @Column(name="observacoes")
    private String observacoes;
    
    @OneToOne
    @JoinColumn(name = "id_foto", referencedColumnName = "id_foto")
    @Cascade(CascadeType.SAVE_UPDATE)
    private Foto foto;
    
    @Column(name="situacao")
    private String situacao;
    
    @Column(name="placa_veiculo")
    private String placaVeiculo;
    
    @Column(name="num_cadastro_veiculo")
    private String cadastroVeiculo;
    
    @Column(name="descricao_veiculo")
    private String descricaoVeiculo;
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "id_funcao", referencedColumnName = "id_funcao", insertable = true, updatable = true)
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.PERSIST)
    private Funcao funcao;
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "id_setor", referencedColumnName = "id", insertable = true, updatable = true)
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.PERSIST)
    private Setor setor;
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "id_cargo", referencedColumnName = "id_cargo", insertable = true, updatable = true)
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.PERSIST)
    private Cargo cargo;

    @Column(name="data_desligamento")
    @Temporal(TemporalType.DATE)
    private Date dataDesligamento;
        
    /*@ManyToMany(fetch=FetchType.EAGER) 
    @JoinTable(name="colaborador_ferias", schema="catalogo", 
               joinColumns=@JoinColumn(name="id_colaborador"), 
               inverseJoinColumns=@JoinColumn(name="id_ferias")) 
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.ALL)
    private Collection<Ferias> ferias;*/
    
    @ManyToMany(mappedBy = "colaboradores", cascade = javax.persistence.CascadeType.ALL)
    private List<Ferias> ferias;
    
    public Colaborador()
    {
    }

    public String getCelular1()
    {
        return celular1;
    }

    public void setCelular1(String celular1)
    {
        this.celular1 = celular1;
    }

    public String getCelular2()
    {
        return celular2;
    }

    public void setCelular2(String celular2)
    {
        this.celular2 = celular2;
    }

    public String getConjuge()
    {
        return conjuge;
    }

    public void setConjuge(String conjuge)
    {
        this.conjuge = conjuge;
    }

    public String getConselhoClasse()
    {
        return conselhoClasse;
    }

    public void setConselhoClasse(String conselhoClasse)
    {
        this.conselhoClasse = conselhoClasse;
    }

    public String getCpf()
    {
        return cpf;
    }

    public void setCpf(String cpf)
    {
        this.cpf = cpf;
    }

    public Date getDataAdmissao()
    {
        return dataAdmissao;
    }

    public void setDataAdmissao(Date dataAdmissao)
    {
        this.dataAdmissao = dataAdmissao;
    }

    public Date getDataNascimento()
    {
        return dataNascimento;
    }

    public void setDataNascimento(Date dataNascimento)
    {
        this.dataNascimento = dataNascimento;
    }

    public String getDependentes()
    {
        return dependentes;
    }

    public void setDependentes(String dependentes)
    {
        this.dependentes = dependentes;
    }

    public String getEmailInstitucional()
    {
        return emailInstitucional;
    }

    public void setEmailInstitucional(String emailInstitucional)
    {
        this.emailInstitucional = emailInstitucional;
    }

    public String getEmailPessoal()
    {
        return emailPessoal;
    }

    public void setEmailPessoal(String emailPessoal)
    {
        this.emailPessoal = emailPessoal;
    }

    public String getEstadoCivil()
    {
        return estadoCivil;
    }

    public void setEstadoCivil(String estadoCivil)
    {
        this.estadoCivil = estadoCivil;
    }

    public Date getExpedicaoRg()
    {
        return expedicaoRg;
    }

    public void setExpedicaoRg(Date expedicaoRg)
    {
        this.expedicaoRg = expedicaoRg;
    }

    public String getFatorRh()
    {
        return fatorRh;
    }

    public void setFatorRh(String fatorRh)
    {
        this.fatorRh = fatorRh;
    }

    public int getId()
    {
        return id;
    }

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

    public String getMae()
    {
        return mae;
    }

    public void setMae(String mae)
    {
        this.mae = mae;
    }

    public String getNacionalidade()
    {
        return nacionalidade;
    }

    public void setNacionalidade(String nacionalidade)
    {
        this.nacionalidade = nacionalidade;
    }

    public String getNaturalidade()
    {
        return naturalidade;
    }

    public void setNaturalidade(String naturalidade)
    {
        this.naturalidade = naturalidade;
    }

    public String getNome()
    {
        return nome;
    }

    public void setNome(String nome)
    {
        this.nome = nome;
    }

    public String getObservacoes()
    {
        return observacoes;
    }

    public void setObservacoes(String observacoes)
    {
        this.observacoes = observacoes;
    }

    public String getOrgaoExpedidor()
    {
        return orgaoExpedidor;
    }

    public void setOrgaoExpedidor(String orgaoExpedidor)
    {
        this.orgaoExpedidor = orgaoExpedidor;
    }

    public String getPai()
    {
        return pai;
    }

    public void setPai(String pai)
    {
        this.pai = pai;
    }

    public String getPisPasep()
    {
        return pisPasep;
    }

    public void setPisPasep(String pisPasep)
    {
        this.pisPasep = pisPasep;
    }

    public String getRg()
    {
        return rg;
    }

    public void setRg(String rg)
    {
        this.rg = rg;
    }

    public String getSexo()
    {
        return sexo;
    }

    public void setSexo(String sexo)
    {
        this.sexo = sexo;
    }

    public String getSituacao()
    {
        return situacao;
    }

    public void setSituacao(String situacao)
    {
        this.situacao = situacao;
    }

    public String getTelefone1()
    {
        return telefone1;
    }

    public void setTelefone1(String telefone1)
    {
        this.telefone1 = telefone1;
    }

    public String getTelefone2()
    {
        return telefone2;
    }

    public void setTelefone2(String telefone2)
    {
        this.telefone2 = telefone2;
    }

    public String getTipoSanguineo()
    {
        return tipoSanguineo;
    }

    public void setTipoSanguineo(String tipoSanguineo)
    {
        this.tipoSanguineo = tipoSanguineo;
    }

    public String getTituloEleitoral()
    {
        return tituloEleitoral;
    }

    public void setTituloEleitoral(String tituloEleitoral)
    {
        this.tituloEleitoral = tituloEleitoral;
    }

    public Endereco getEndereco()
    {
        return endereco;
    }

    public void setEndereco(Endereco endereco)
    {
        this.endereco = endereco;
    }

    public Instituicao getInstituicao()
    {
        return instituicao;
    }

    public void setInstituicao(Instituicao instituicao)
    {
        this.instituicao = instituicao;
    }

    public Foto getFoto()
    {
        return foto;
    }

    public void setFoto(Foto foto)
    {
        this.foto = foto;
    }

    public Cargo getCargo()
    {
        return cargo;
    }

    public void setCargo(Cargo cargo)
    {
        this.cargo = cargo;
    }

    public Funcao getFuncao()
    {
        return funcao;
    }

    public void setFuncao(Funcao funcao)
    {
        this.funcao = funcao;
    }

    public Setor getSetor()
    {
        return setor;
    }

    public void setSetor(Setor setor)
    {
        this.setor = setor;
    }

    public String getCadastroVeiculo()
    {
        return cadastroVeiculo;
    }

    public void setCadastroVeiculo(String cadastroVeiculo)
    {
        this.cadastroVeiculo = cadastroVeiculo;
    }

    public String getDescricaoVeiculo()
    {
        return descricaoVeiculo;
    }

    public void setDescricaoVeiculo(String descricaoVeiculo)
    {
        this.descricaoVeiculo = descricaoVeiculo;
    }

    public String getPlacaVeiculo()
    {
        return placaVeiculo;
    }

    public void setPlacaVeiculo(String placaVeiculo)
    {
        this.placaVeiculo = placaVeiculo;
    }

    public Date getDataDesligamento() {
        return dataDesligamento;
    }

    public void setDataDesligamento(Date dataDesligamento) {
        this.dataDesligamento = dataDesligamento;
    }

    public List<Ferias> getFerias() {
        return ferias;
    }

    public void setFerias(List<Ferias> ferias) {
        this.ferias = ferias;
    }            
}
FERIAS:
package catalogo.modelo;

import java.io.Serializable;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import javax.persistence.*;

@Entity
@Table(name = "ferias", schema = "catalogo")
public class Ferias implements Serializable {
        
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id_ferias")
    private int idFerias;                    
    
    @Column(name="tipo")
    private String tipo;
            
    @Column(name="exercicio")
    private int exercicio;
    
    @Column(name="periodo1")
    private int periodo1;
    
    @Column(name="inicio1")
    @Temporal(TemporalType.DATE)
    private Date inicio1;
    
    @Column(name="periodo2")
    private int periodo2;
    
    @Column(name="inicio2")
    @Temporal(TemporalType.DATE)
    private Date inicio2;
    
    private String obs;      
    
    /*@ManyToMany(fetch=FetchType.LAZY) 
    @JoinTable(name="colaborador_ferias", schema="catalogo", 
               joinColumns={@JoinColumn(name="id_ferias")}, 
               inverseJoinColumns={@JoinColumn(name="id_colaborador")}) 
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.ALL)
    private Collection<Colaborador> colaboradores;*/                             
    
    @ManyToMany(cascade = CascadeType.ALL, fetch = FetchType.LAZY)      
    @JoinTable(name="colaborador_ferias", schema = "catalogo",     
              joinColumns={@JoinColumn(name="id_ferias")},       
              inverseJoinColumns={@JoinColumn(name="id_colaborador")})      
   private List<Colaborador> colaboradores;   
    
    public Ferias(){
        
    }  
    
    public int getExercicio() {
        return exercicio;
    }

    public void setExercicio(int exercicio) {
        this.exercicio = exercicio;
    }   

    public int getIdFerias() {
        return idFerias;
    }

    public void setIdFerias(int idFerias) {
        this.idFerias = idFerias;
    }

    public Date getInicio1() {
        return inicio1;
    }

    public void setInicio1(Date inicio1) {
        this.inicio1 = inicio1;
    }

    public Date getInicio2() {
        return inicio2;
    }

    public void setInicio2(Date inicio2) {
        this.inicio2 = inicio2;
    }

    public String getObs() {
        return obs;
    }

    public void setObs(String obs) {
        this.obs = obs;
    }

    public int getPeriodo1() {
        return periodo1;
    }

    public void setPeriodo1(int periodo1) {
        this.periodo1 = periodo1;
    }

    public int getPeriodo2() {
        return periodo2;
    }

    public void setPeriodo2(int periodo2) {
        this.periodo2 = periodo2;
    }

    public String getTipo() {
        return tipo;
    }

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

    public List<Colaborador> getColaboradores() {
        return colaboradores;
    }

    public void setColaboradores(List<Colaborador> colaboradores) {
        this.colaboradores = colaboradores;
    }        
}
ACTION:
package catalogo.controle.actions;

import catalogo.controle.forms.FeriasForm;
import catalogo.dao.GenericDAO;
import catalogo.modelo.Colaborador;
import catalogo.modelo.Ferias;
import catalogo.util.ConverterData;
import java.util.ArrayList;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts.action.*;

public class CadastrarFeriasAction extends Action
{
    private String retorno;
    private String msg;      

    public CadastrarFeriasAction(){
    }

    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
        throws Exception
    {        
        FeriasForm feriasForm = (FeriasForm)form;
        
        Colaborador colaborador = new Colaborador();                
        Ferias ferias = new Ferias();
                
        /*int idColaborador = Integer.parseInt(feriasForm.getIdColaborador());
        GenericDAO colaboradorDao = new GenericDAO(Colaborador.class);
        colaborador = (Colaborador) colaboradorDao.carregarPeloId(idColaborador);   
        
        colaborador.setFerias(new ArrayList<Ferias>());
        
        ferias.setTipo(feriasForm.getTipo());
        ferias.setExercicio(Integer.parseInt(feriasForm.getExercicio()));
        ferias.setPeriodo1(Integer.parseInt(feriasForm.getPeriodo1()));
        ferias.setInicio1(ConverterData.converteData(feriasForm.getInicio1()));        
        ferias.setPeriodo2(Integer.parseInt(feriasForm.getPeriodo2()));
        ferias.setInicio2(ConverterData.converteData(feriasForm.getInicio2()));        
        ferias.setObs(feriasForm.getObs());
        ferias.setColaboradores(new ArrayList<Colaborador>());  */              
                
        GenericDAO colaboradorDao = new GenericDAO(Colaborador.class);
        colaborador = (Colaborador) colaboradorDao.carregarPeloId(52);   
        
        colaborador.setFerias(new ArrayList<Ferias>());
        
        ferias.setTipo("Oficial");
        ferias.setExercicio(Integer.parseInt("2011"));
        ferias.setPeriodo1(Integer.parseInt("15"));
        ferias.setInicio1(ConverterData.converteData("21/10/2011"));        
        ferias.setPeriodo2(Integer.parseInt("15"));
        ferias.setInicio2(ConverterData.converteData("15/12/2001"));        
        ferias.setObs("teste");
        
        ferias.setColaboradores(new ArrayList<Colaborador>());
        
        colaborador.getFerias().add(ferias);                         
        ferias.getColaboradores().add(colaborador); 
                      
        GenericDAO dao = new GenericDAO(Ferias.class);                       
              
        try {
            dao.salvar(colaborador);
            retorno = "sucesso";
            msg = "As f&eacute;rias do funcion&aacute;rio foram cadastradas com sucesso!";
        } 
        catch (Exception e) {                     
            retorno = "erro";    
            msg = "Não foi possível salvar as férias do funcionário! " + e.getMessage().toString();             
            e.printStackTrace();  
        }          
        
        request.setAttribute("msg", msg);
        
        return mapping.findForward(retorno);
    }
}
ACTIONFORM:
package catalogo.controle.forms;

import org.apache.struts.action.ActionForm;

public class FeriasForm extends ActionForm {
    
    //private int idFerias;
    private String idColaborador;
    private String tipo;
    //private int exercicio;
    private String exercicio;
    private String periodo1;
    private String inicio1;
    private String periodo2;
    private String inicio2;  
    private String obs;

    public FeriasForm(){
    }

    public String getExercicio() {
        return exercicio;
    }

    public void setExercicio(String exercicio) {
        this.exercicio = exercicio;
    }       

    public String getIdColaborador() {
        return idColaborador;
    }

    public void setIdColaborador(String idColaborador) {
        this.idColaborador = idColaborador;
    }  

    public String getInicio1() {
        return inicio1;
    }

    public void setInicio1(String inicio1) {
        this.inicio1 = inicio1;
    }

    public String getInicio2() {
        return inicio2;
    }

    public void setInicio2(String inicio2) {
        this.inicio2 = inicio2;
    }

    public String getObs() {
        return obs;
    }

    public void setObs(String obs) {
        this.obs = obs;
    }

    public String getPeriodo1() {
        return periodo1;
    }

    public void setPeriodo1(String periodo1) {
        this.periodo1 = periodo1;
    }

    public String getPeriodo2() {
        return periodo2;
    }

    public void setPeriodo2(String periodo2) {
        this.periodo2 = periodo2;
    } 

    public String getTipo() {
        return tipo;
    }

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

cara,
nao consegui identificar o erro, vc vai ter que pegar o log de erro msm, para ver o que está acontecendo.

t+

J

Beleza,

Tambem não estou conseguindo achar o erro. Estou tetando usar o log4j, mas não estou conseguindo. Basta eu colocar o jar dentro das bibliotecas e depois o log4j.propertiers eu coloco onde?

A

segue um link para configuração, http://faq.infolink.com.br/Log4J

cara, qual IDE e servidor vc ta usando? esse seu projeto ta muito estranho, para não estar aparecendo o log de erro.

t+

J

Esse projeto está estranho em vários aspectos.

Eu esto usando o NetBeans 7.0.1 e o Tomcat 7.0.14

J

Não estou conseguindo colocar o log4j para rodar, o pior é que já rodava no projeto antes.

Criei o arquivo log4j.properties, dentro do diretorio WEB-INF, assim:

log4j.rootLogger=ALL
log4j.logger.teste=ALL
log4j.appender.A1=org.apache.log4j.FileAppender
log4j.appender.A1.layout=org.apache.log4j.PatternLayout
log4j.appender.A1.layout.ConversionPattern=%d %-5p %c{2} %M.%L %x - %m\n
log4j.appender.A1.file=/web/logs/log.txt

Coloquei o jar dentro das bibliotecas.

E no Action, fiz isso:

private Logger logger;
 logger = Logger.getLogger("teste");

try {
            dao.salvar(colaborador);
            retorno = "sucesso";
            msg = "As f&eacute;rias do funcion&aacute;rio foram cadastradas com sucesso!";
        } 
        catch (Exception e) {                     
            retorno = "erro";    
            msg = "Não foi possível salvar as férias do funcionário! " + e.getMessage().toString();             
            e.printStackTrace();  
            logger.info(e.getMessage());
        }

Não está funcionando, o arquivo log.txt está vazio, nenhum erro aparece e não sei qual o caminho que coloco aqui: log4j.appender.A1.file (no log4j.properties)

A

cara,

vc ja deu uma verificada no log na pasta do tomcat, para ver se está sendo impresso o erro la.

t+

J

Acabei de ver e a pasta de logs do tomcat está vazia hehehehe.
Vou ver o que faço aqui, posso ter modelado errado esse relacionamento tambem, talvez seja um para muitos, vou rever com calma

Obrigado mesmo pela ajuda.
Vou continuar tentando e posto aqui.

J

Mudei o relacionamento para 1:N, só que continua dando o mesmo erro.
Agora consegui ver algumas coisas no log do Apache, não sei se vai ajudar.

COLABORADOR:

@OneToMany(mappedBy = "colaborador")
    private List<Ferias> ferias;

FERIAS:

@Entity
@Table(name = "ferias", schema = "catalogo")
public class Ferias implements Serializable {
        
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name="id_ferias")
    private int idFerias; 
    
    @ManyToOne(fetch = FetchType.EAGER)
    @JoinColumn(name = "id_colaborador", referencedColumnName = "id_colaborador", insertable = true, updatable = true)
    @Fetch(FetchMode.JOIN)
    @Cascade(CascadeType.PERSIST)        
    private Colaborador colaborador;
      
    @Column(name="tipo")
    private String tipo;
            
    @Column(name="exercicio")
    private int exercicio;
    
    @Column(name="periodo1")
    private int periodo1;
    
    @Column(name="inicio1")
    @Temporal(TemporalType.DATE)
    private Date inicio1;
    
    @Column(name="periodo2")
    private int periodo2;
    
    @Column(name="inicio2")
    @Temporal(TemporalType.DATE)
    private Date inicio2;
    
    private String obs;

BANCO DE DADOS
Colaborador: não tem nada de ferias
Ferias: id_ferias, id_colaborador(que se relaciona com o id da tabela colaborador), tipo, periodo1. etc…

ACTION:

Colaborador colaborador = new Colaborador();                
        Ferias ferias = new Ferias();                      
        
        ferias.setTipo(feriasForm.getTipo());
        ferias.setExercicio(Integer.parseInt(feriasForm.getExercicio()));
        ferias.setPeriodo1(Integer.parseInt(feriasForm.getPeriodo1()));
        ferias.setInicio1(ConverterData.converteData(feriasForm.getInicio1()));        
        ferias.setPeriodo2(Integer.parseInt(feriasForm.getPeriodo2()));
        ferias.setInicio2(ConverterData.converteData(feriasForm.getInicio2()));        
        ferias.setObs(feriasForm.getObs());
        ferias.setColaboradores(new ArrayList<Colaborador>());  */              
                
        GenericDAO colaboradorDao = new GenericDAO(Colaborador.class);
        colaborador = (Colaborador) colaboradorDao.carregarPeloId(52);                  
        ferias.setColaborador(colaborador);
        
        ferias.setTipo("Oficial");
        ferias.setExercicio(Integer.parseInt("2011"));
        ferias.setPeriodo1(Integer.parseInt("15"));
        ferias.setInicio1(ConverterData.converteData("21/10/2011"));        
        ferias.setPeriodo2(Integer.parseInt("15"));
        ferias.setInicio2(ConverterData.converteData("15/12/2001"));        
        ferias.setObs("teste");
                        
        colaborador.getFerias().add(ferias);  

       GenericDAO dao = new GenericDAO(Ferias.class);                   
               
        try {
            dao.salvar(ferias);
            retorno = "sucesso";
            msg = "As f&eacute;rias do funcion&aacute;rio foram cadastradas com sucesso!";
        } 
        catch (Exception e) {                     
            retorno = "erro";    
            msg = "Não foi possível salvar as férias do funcionário! " + e.getMessage().toString();             
            e.printStackTrace();              
        }

LOG DO APACHE:

Não entendi o primeiro erro do log, não tenho nenhuma anotação Column no campo colaborador da minha classe Ferias.

J

CONSEGUI!

Achei o erro, finalmente. Desculpa incomodar tanto, e pior, por uma bobeira, o campo id_ferias, no BD, não estava como auto increment. Era só isso. Depois de várias mudanças, cheguei a esse ultimo erro e consertei, aí funcionou. Que bobeira. Desculpem mesmo.

Culpa da nova interface do MySql Administrator, que agora é MySql Workbench, não gostei nenhum pouco, to quebrando a cabeça direto pra fazer coisas simples, como por exemplo, colocar um campo como AI, o que geralmente já é padrão quando se cria prymary keys em tabelas. Muto fraquinho esse novo SGBD.

Obrigado por tudo, mais uma vez.

Abraço.

A

bom q resolveu, :smiley:

cara mas da um olhada nesse ambiente de desenvolvimento, pois nao é normal não aparecer o log de erro, pq vc vai ter dificuldade em trabalhar.

marque o poste como resolvido.

t+

J

Pois é, vc tem toda razão. Pode deixar que vou colocar o log4j para rodar, por enquanto estou usando o do apache mesmo.

Valeu pelas dicas.

Abração. Tudo de bom.

Criado 24 de outubro de 2011
Ultima resposta 26 de out. de 2011
Respostas 34
Participantes 2