Bom, acredito que a solução pro meu problema seja bem simples (ou assim espero).
O que quero fazer é simples: tenho uma tabela eleitor e uma tabela curso. Entre essas
tabelas, tenho uma tabela associativa cursos_eleitor. O que quero? Ao acionar o session.save()
no objeto do eleitor, que contém a lista de cursos que ele tem, o hibernate tambem fará a inserção
dos dados na tabela cursos_eleitor, através da lista de cursos. Seguem as classes em questão:
Classe de Eleitor
@Entity
@Table(name="eleitor")
public class Eleitor implements Serializable{
private static final long serialVersionUID = -6226011868072777381L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id_eleitor")
private Integer idEleitor;
@ManyToOne
@JoinColumn(name="id_cidade")
private Cidade cidade;
@Column(name="el_nome")
private String nome;
...
...
...
@ManyToMany(cascade = {javax.persistence.CascadeType.ALL})
@Cascade(value=CascadeType.SAVE_UPDATE)
@JoinTable(name="cursos_eleitor",
joinColumns = @JoinColumn(name="id_eleitor", referencedColumnName="id_eleitor"),
inverseJoinColumns = @JoinColumn(name="id_curso", referencedColumnName="id_curso"))
private List<Curso> listaCursos = new ArrayList<Curso>();
@OneToMany(mappedBy="campanha", cascade = {javax.persistence.CascadeType.ALL})
@Cascade(value=CascadeType.SAVE_UPDATE)
private List<CampanhasEleitor> listaCampanhasEleitor = new ArrayList<CampanhasEleitor>();
@OneToMany(mappedBy="eleitor", cascade = {javax.persistence.CascadeType.ALL})
@Cascade(value=CascadeType.SAVE_UPDATE)
private List<Experiencia> listaExperiencias = new ArrayList<Experiencia>();
@Transient
private DateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
@Transient
private DecimalFormat df = new DecimalFormat();
//------------------------Getters e Setters--------------------------------
Classe de Curso
@Entity
@Table(name="curso")
public class Curso implements Serializable{
private static final long serialVersionUID = -4067988173598135204L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column(name="id_curso")
private Integer idCurso;
@Column(name="cs_nome")
private String nome;
@Column(name="cs_tipo")
private String tipo;
@Column(name="cs_inst")
private String inst;
@ManyToMany
@JoinTable(name="cursos_eleitor",
joinColumns = @JoinColumn(name="id_curso",referencedColumnName="id_curso"),
inverseJoinColumns = @JoinColumn(name="id_eleitor", referencedColumnName="id_eleitor"))
private List<Eleitor> listaEleitores = new ArrayList<Eleitor>();
@Transient
private String ntipo;
@Transient
private boolean marcado;
@Transient
private int index;
//------------------------Getters e Setters--------------------------------
E finalmente a minha classe DAO:
public class EleitorDAO extends GenericDAO{
Session session = getSession();
@SuppressWarnings("unchecked")
public List<Eleitor> all(){
Query query = session.createQuery("from Eleitor");
List<Eleitor> listaEleitores = query.list();
return listaEleitores;
}
public Eleitor one(Eleitor ele){
Query query = session.createQuery("from Eleitor e where e.idEleitor = ?");
query.setInteger(0, ele.getIdEleitor());
Eleitor Eleitor = (Eleitor) query.uniqueResult();
return Eleitor;
}
public void update(Eleitor ele){
session.update(ele);
session.getTransaction().commit();
}
public void insert(Eleitor ele){
session.persist(ele);
session.getTransaction().commit();
}
public void delete(Eleitor ele){
session.delete(ele);
session.getTransaction().commit();
}
}
Antes, ao executar o método insert da minha classe DAO, eu executava o session.save(), porém, em um tópico aqui do forum mesmo, o proprio usuario que fez o mesmo questionamento
que eu, disse ter resolvido o problema ao trocar o session.save() para session.persist(). Porém, isso não funcionou pra mim.
Se alguem puder ajudar, ficarei muito grato!