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érias do funcioná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();
}
...