Finalmente eu consegui XD!!!
Eu mudei alguns mapeamentos e mudei algumas coisas no equals e hashCode, no final das contas tenho quase certeza de que o problema estava realmente no mapeamento da entidade colocando Merge e alterando por merge também e não mais por saveOrUpdate, bom pra quem estiver passando por este problema segue meu código completo!! Ha esqueci de dizer, eu estou usando o VRaptor como MVC, por isso algumas annotations que não fazem parte da JPA, como @Component !!
Explicação: Tabela de Privilegios, 1 privilegio pode ter 0 ou mais recursos (OneToMany), e cada recurso tem que ter pelo menos 1 privilegio (ManyToOne)
[code]
@Entity
@Component
public class Recurso implements Serializable, Comparable{
private static final long serialVersionUID = 826924108132014590L;
@Id
@GeneratedValue(generator = “Recurso”)
@SequenceGenerator(name = “Recurso”, initialValue = 1, sequenceName = “sequence_recurso”)
private Long cod;
@Column
private String nome;
@Transient
private String descRecurso;
@ManyToOne
private Privilegio privilegio;
@Override
public int compareTo(Recurso recurso) {
return this.descRecurso.compareTo(recurso.getDescRecurso());
}
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
if (!(cod==null)){
return prime * result + ((cod == null) ? 0 : cod.hashCode());
}
// result = prime * result + ((descRecurso == null) ? 0 : descRecurso.hashCode());
result = prime * result + ((nome == null) ? 0 : nome.hashCode());
// result = prime * result + ((privilegio == null) ? 0 : privilegio.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Recurso other = (Recurso) obj;
if(!(cod==null)){
return cod.equals(other.getCod());
}else if(!(nome==null)){
return nome.equals(other.getNome());
}
return false;
}
Getters e Setters…[/code]
[code]
@Entity
@Component
public class Privilegio implements Serializable {
private static final long serialVersionUID = -6175377460054211138L;
@Id
@GeneratedValue(generator = “Privilegio”)
@SequenceGenerator(name = “Privilegio”, initialValue = 1, sequenceName = “sequence_privilegio”)
private Long cod;
@Column(name=“Nome”)
private String nome;
@ManyToOne(cascade={CascadeType.ALL}, targetEntity=Empresa.class, fetch=FetchType.EAGER )
@Cascade(value={
org.hibernate.annotations.CascadeType.SAVE_UPDATE,
org.hibernate.annotations.CascadeType.REMOVE})
@ForeignKey(name=“CodEmpresa_Privilegio_FK”)
private Empresa empresa;
@OneToMany(targetEntity=Recurso.class, fetch=FetchType.EAGER, orphanRemoval=true)//, orphanRemoval=true
@Cascade(value={
org.hibernate.annotations.CascadeType.SAVE_UPDATE,
org.hibernate.annotations.CascadeType.DELETE,
org.hibernate.annotations.CascadeType.MERGE
})
@JoinColumn(name="privilegio_cod")
private Set<Recurso> recursos = new HashSet<Recurso>();
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((cod == null) ? 0 : cod.hashCode());
if (cod==null){
result = prime * result + ((empresa == null) ? 0 : empresa.hashCode());
result = prime * result + ((nome == null) ? 0 : nome.hashCode());
}
// result = prime * result;// + ((recursos == null) ? 0 : recursos.hashCode())
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null) return false;
if (getClass() != obj.getClass()) return false;
Privilegio privilegio = (Privilegio) obj;
if (!(cod==null)){
return cod.equals(privilegio.getCod());
}else if (!(empresa==null && nome==null)){
if(!(privilegio.getEmpresa()==null && privilegio.getNome()==null)){
return empresa.equals(privilegio.empresa) && nome.equals(privilegio.nome);
}
}
return false;
}
Getters e Setters…[/code]
Código que faz o merge de acordo com a requisição na JSP!!
this.privDao.mergePrivilegio(privilegio);
Metodo criado no privilegioDao!!
public void mergePrivilegio(Privilegio privilegio) {
operacoes.merge(privilegio);
}
Eu fiz uma classe que guarda todas as consultas padrões, só não sei se é uma boa idéia, mas ta ai!!
public class HibernateOperacoes {
private final Session session;
private final Object obj;
public HibernateOperacoes(Object obj, Session sessao) throws Throwable {
System.out.println("Entrou no Construtor do Hibernate");
this.obj = obj;
this.session = sessao;
}
public void merge(Object obj) {
session.beginTransaction();
session.merge(obj);
session.getTransaction().commit();
}
...
}
Agora só preciso ver o de exclusão em cascata !!!