Hibernate não deleta
Boa tarde,
Estou com um probleminha aqui.
estou utilizando struts 1.x e hibernate em uma aplicação.
Ao tentar deletar um registro o hibernate "não faz nada", não gera nenhum exception e segue o flow do struts.
Lembrando que só esta entidade esta com esse problema, as outras estão OK
22/01/2010 12:42:14 org.hibernate.event.def.DefaultDeleteEventListener deleteTransientEntity
INFO: handling transient entity in delete processing
Creio q seja alguma coisa errada no mapeamento do relacionamento.
Essa é a classe ControleDocumentosEmpresa (de onde quero deletar o registro)
@Entity()
@Table(name="controle_documentos_empresa")
public class ControleDocumentosEmpresa extends org.apache.struts.action.ActionForm implements Serializable {
private static final long serialVersionUID = 1L;
public ControleDocumentosEmpresa(){
ConvertUtils.register(new ConversorData(), Date.class);
}
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column()
private int controle_cod;
@Column()
@Temporal(javax.persistence.TemporalType.DATE)
private Date data_emissao;
@Column()
@Temporal(javax.persistence.TemporalType.DATE)
private Date data_validade;
@Column()
@Version
private Timestamp update_em;
@Column()
private String update_por;
@Column()
private String comentarios;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="cliente_cod")
@Fetch(FetchMode.JOIN)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Cliente cliente = new Cliente();
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="reparticao_cod")
@Fetch(FetchMode.JOIN)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Reparticao reparticao = new Reparticao();
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="doc_cod")
@Fetch(FetchMode.JOIN)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Doc doc = new Doc();
Essa é a classe Cliente
@Entity()
@Table(name="cliente")
public class Cliente extends org.apache.struts.action.ActionForm implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column()
private int cliente_cod;
@Column()
private String razao;
@Column(unique=true)
private String cnpj;
@Column()
private String tel1;
@Column()
private String tel2;
@Column()
private String fax;
@Column()
private String email;
@Column()
private String logadouro;
@Column()
private int numero;
@Column()
private String bairro;
@Column()
private String complemento;
@Column()
private String cidade;
@Column()
private String estado;
@Column()
private String cep;
@OneToMany(mappedBy="cliente", fetch=FetchType.LAZY)
@Cascade(org.hibernate.annotations.CascadeType.REMOVE)
private List<Navio> navio;
@OneToMany(mappedBy="cliente", fetch=FetchType.LAZY)
@Cascade(org.hibernate.annotations.CascadeType.REMOVE)
private List<ControleDocumentosEmpresa> controle;
Essa é classe Doc
@Entity()
@Table(name="doc")
public class Doc extends org.apache.struts.action.ActionForm implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column()
private int doc_cod;
@Column(unique=true)
private String doc;
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="reparticao_cod")
@Fetch(org.hibernate.annotations.FetchMode.JOIN)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Reparticao reparticao = new Reparticao();
@OneToMany(mappedBy="doc", fetch=FetchType.EAGER)
@Cascade(org.hibernate.annotations.CascadeType.REMOVE)
private List<ControleDocumentosEmpresa> controle;
Essa é a classe Reparticao
@Entity()
@Table(name="reparticao")
public class Reparticao extends org.apache.struts.action.ActionForm implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column()
private int reparticao_cod;
@Column(unique=true)
private String nome;
@Column(unique=true)
private String apelido;
@OneToMany(mappedBy="reparticao", fetch=FetchType.LAZY)
@Cascade(org.hibernate.annotations.CascadeType.REMOVE)
private List<Doc> doc;
@OneToMany(mappedBy="reparticao", fetch=FetchType.LAZY)
@Cascade(org.hibernate.annotations.CascadeType.REMOVE)
private List<ControleDocumentosEmpresa> controle;
Metodo para deletar
public void excluirControleEmpresa(ControleDocumentosEmpresa controle)throws Exception{
session = HibernateUtil.getSession();
transaction = session.beginTransaction();
criteria = session.createCriteria(ControleDocumentosEmpresa.class);
criteria.add(Restrictions.eq("controle_cod",controle.getControle_cod()));
session.clear();
session.delete(controle);
transaction.commit();
session.flush();
}
Esse é o Action do Struts
String resp="";
ControleDocumentosEmpresa controle = new ControleDocumentosEmpresa();
controle.setControle_cod(Integer.parseInt(request.getParameter("cod")));
ControleDao cdao = new ControleDao();
List excluido = new ArrayList();
try{
int cod = controle.getControle_cod();
excluido = cdao.listaTodoControleCod(cod);
request.setAttribute("excluido",excluido);
cdao.excluirControleEmpresa(controle);
request.setAttribute("msg","<img align='absmiddle' src='images/ok.gif'/> Controle ");
request.setAttribute("msg1"," excluido com sucesso.");
request.setAttribute("consultado","teste");
request.setAttribute("teste","teste");
resp="ok";
}catch(Exception e){
System.out.println(e.getMessage());
request.setAttribute("erro",e.getCause());
resp="erro_geral";
}
return mapping.findForward(resp);
Estou com um probleminha aqui.
estou utilizando struts 1.x e hibernate em uma aplicação.
Ao tentar deletar um registro o hibernate "não faz nada", não gera nenhum exception e segue o flow do struts.
Lembrando que só esta entidade esta com esse problema, as outras estão OK
22/01/2010 12:42:14 org.hibernate.event.def.DefaultDeleteEventListener deleteTransientEntity
INFO: handling transient entity in delete processing
Creio q seja alguma coisa errada no mapeamento do relacionamento.
Essa é a classe ControleDocumentosEmpresa (de onde quero deletar o registro)
@Entity()
@Table(name="controle_documentos_empresa")
public class ControleDocumentosEmpresa extends org.apache.struts.action.ActionForm implements Serializable {
private static final long serialVersionUID = 1L;
public ControleDocumentosEmpresa(){
ConvertUtils.register(new ConversorData(), Date.class);
}
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column()
private int controle_cod;
@Column()
@Temporal(javax.persistence.TemporalType.DATE)
private Date data_emissao;
@Column()
@Temporal(javax.persistence.TemporalType.DATE)
private Date data_validade;
@Column()
@Version
private Timestamp update_em;
@Column()
private String update_por;
@Column()
private String comentarios;
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="cliente_cod")
@Fetch(FetchMode.JOIN)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Cliente cliente = new Cliente();
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="reparticao_cod")
@Fetch(FetchMode.JOIN)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Reparticao reparticao = new Reparticao();
@ManyToOne(fetch=FetchType.LAZY)
@JoinColumn(name="doc_cod")
@Fetch(FetchMode.JOIN)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Doc doc = new Doc();
Essa é a classe Cliente
@Entity()
@Table(name="cliente")
public class Cliente extends org.apache.struts.action.ActionForm implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column()
private int cliente_cod;
@Column()
private String razao;
@Column(unique=true)
private String cnpj;
@Column()
private String tel1;
@Column()
private String tel2;
@Column()
private String fax;
@Column()
private String email;
@Column()
private String logadouro;
@Column()
private int numero;
@Column()
private String bairro;
@Column()
private String complemento;
@Column()
private String cidade;
@Column()
private String estado;
@Column()
private String cep;
@OneToMany(mappedBy="cliente", fetch=FetchType.LAZY)
@Cascade(org.hibernate.annotations.CascadeType.REMOVE)
private List<Navio> navio;
@OneToMany(mappedBy="cliente", fetch=FetchType.LAZY)
@Cascade(org.hibernate.annotations.CascadeType.REMOVE)
private List<ControleDocumentosEmpresa> controle;
Essa é classe Doc
@Entity()
@Table(name="doc")
public class Doc extends org.apache.struts.action.ActionForm implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column()
private int doc_cod;
@Column(unique=true)
private String doc;
@ManyToOne(fetch=FetchType.EAGER)
@JoinColumn(name="reparticao_cod")
@Fetch(org.hibernate.annotations.FetchMode.JOIN)
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
private Reparticao reparticao = new Reparticao();
@OneToMany(mappedBy="doc", fetch=FetchType.EAGER)
@Cascade(org.hibernate.annotations.CascadeType.REMOVE)
private List<ControleDocumentosEmpresa> controle;
Essa é a classe Reparticao
@Entity()
@Table(name="reparticao")
public class Reparticao extends org.apache.struts.action.ActionForm implements Serializable{
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
@Column()
private int reparticao_cod;
@Column(unique=true)
private String nome;
@Column(unique=true)
private String apelido;
@OneToMany(mappedBy="reparticao", fetch=FetchType.LAZY)
@Cascade(org.hibernate.annotations.CascadeType.REMOVE)
private List<Doc> doc;
@OneToMany(mappedBy="reparticao", fetch=FetchType.LAZY)
@Cascade(org.hibernate.annotations.CascadeType.REMOVE)
private List<ControleDocumentosEmpresa> controle;
Metodo para deletar
public void excluirControleEmpresa(ControleDocumentosEmpresa controle)throws Exception{
session = HibernateUtil.getSession();
transaction = session.beginTransaction();
criteria = session.createCriteria(ControleDocumentosEmpresa.class);
criteria.add(Restrictions.eq("controle_cod",controle.getControle_cod()));
session.clear();
session.delete(controle);
transaction.commit();
session.flush();
}
Esse é o Action do Struts
String resp="";
ControleDocumentosEmpresa controle = new ControleDocumentosEmpresa();
controle.setControle_cod(Integer.parseInt(request.getParameter("cod")));
ControleDao cdao = new ControleDao();
List excluido = new ArrayList();
try{
int cod = controle.getControle_cod();
excluido = cdao.listaTodoControleCod(cod);
request.setAttribute("excluido",excluido);
cdao.excluirControleEmpresa(controle);
request.setAttribute("msg","<img align='absmiddle' src='images/ok.gif'/> Controle ");
request.setAttribute("msg1"," excluido com sucesso.");
request.setAttribute("consultado","teste");
request.setAttribute("teste","teste");
resp="ok";
}catch(Exception e){
System.out.println(e.getMessage());
request.setAttribute("erro",e.getCause());
resp="erro_geral";
}
return mapping.findForward(resp);
Cleiton Tavares.
Curtidas 0
Respostas
Henrique Weissmann
22/01/2010
Oi Cleiton, o problema está no seu método para deletar:
public void excluirControleEmpresa(ControleDocumentosEmpresa controle)throws Exception{
session = HibernateUtil.getSession();
transaction = session.beginTransaction();
criteria = session.createCriteria(ControleDocumentosEmpresa.class);
criteria.add(Restrictions.eq("controle_cod",controle.getControle_cod()));
session.clear();
session.delete(controle);
transaction.commit();
session.flush();
Procure reescrevê-lo tal como abaixo:
public void excluirControleEmpresa(ControleDocumentosEmpresa controle)throws Exception{
session = HibernateUtil.getSession();
transaction = session.beginTransaction();
criteria = session.createCriteria(ControleDocumentosEmpresa.class);
criteria.add(Restrictions.eq("controle_cod",controle.getControle_cod()));
ControleDocumentosEmpresa registro = (ControleDocumentosEmpresa) criteria.uniqueResult();
session.delete(registro);
transaction.commit();
session.close();
session.flush();
public void excluirControleEmpresa(ControleDocumentosEmpresa controle)throws Exception{
session = HibernateUtil.getSession();
transaction = session.beginTransaction();
criteria = session.createCriteria(ControleDocumentosEmpresa.class);
criteria.add(Restrictions.eq("controle_cod",controle.getControle_cod()));
session.clear();
session.delete(controle);
transaction.commit();
session.flush();
Procure reescrevê-lo tal como abaixo:
public void excluirControleEmpresa(ControleDocumentosEmpresa controle)throws Exception{
session = HibernateUtil.getSession();
transaction = session.beginTransaction();
criteria = session.createCriteria(ControleDocumentosEmpresa.class);
criteria.add(Restrictions.eq("controle_cod",controle.getControle_cod()));
ControleDocumentosEmpresa registro = (ControleDocumentosEmpresa) criteria.uniqueResult();
session.delete(registro);
transaction.commit();
session.close();
session.flush();
GOSTEI 0
Cleiton Tavares.
22/01/2010
Olá Henrique,
agora esta deletando....porém cada vez q deleto um registro da classe ControleDocumentosEmpresa um registro das classes relacionadas é deletado também ...
Poderia me dar uma luz...
Sou iniciante em hibernate e algumas coisas ainda estão confusas pra mim.
Cleiton
agora esta deletando....porém cada vez q deleto um registro da classe ControleDocumentosEmpresa um registro das classes relacionadas é deletado também ...
Poderia me dar uma luz...
Sou iniciante em hibernate e algumas coisas ainda estão confusas pra mim.
Cleiton
GOSTEI 0
Henrique Weissmann
22/01/2010
Oi Cleiton,
é por causa da sua estratégia de cascata.
Repare que você definiu diversas classes dependentes com a anotação @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
Basta que você mude a sua estratégia para restrict. No caso, caso haja registros, e você tente apagar um registro pai, a exclusão será evitada. Se não me engano, há também uma estratégia na qual você pode definir o pai como nulo. Não me lembro do nome exato no momento, mas o auto completar da sua IDE lhe exporá o nome.
é por causa da sua estratégia de cascata.
Repare que você definiu diversas classes dependentes com a anotação @Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
Basta que você mude a sua estratégia para restrict. No caso, caso haja registros, e você tente apagar um registro pai, a exclusão será evitada. Se não me engano, há também uma estratégia na qual você pode definir o pai como nulo. Não me lembro do nome exato no momento, mas o auto completar da sua IDE lhe exporá o nome.
GOSTEI 0
Cleiton Tavares.
22/01/2010
Obrigado Henrique,
Era exatamente isso.
Retirando as linhas abaixo dos relacionamentos da classe ControleDocumentosEmpresa com as demais classesfuncionou direitinho.
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
Voltando ao inicio do chamado.....
O que linha abaixo faz( didaticamente falando :) )
ControleDocumentosEmpresa registro = (ControleDocumentosEmpresa) criteria.uniqueResult();
Mais uma vez ... muito obrigado.
Era exatamente isso.
Retirando as linhas abaixo dos relacionamentos da classe ControleDocumentosEmpresa com as demais classesfuncionou direitinho.
@Cascade(org.hibernate.annotations.CascadeType.DELETE_ORPHAN)
Voltando ao inicio do chamado.....
O que linha abaixo faz( didaticamente falando :) )
ControleDocumentosEmpresa registro = (ControleDocumentosEmpresa) criteria.uniqueResult();
Mais uma vez ... muito obrigado.
GOSTEI 0
Henrique Weissmann
22/01/2010
Oi Cleiton,
ControleDocumentosEmpresa registro = (ControleDocumentosEmpresa) criteria.uniqueResult();
o que ela faz é o seguinte: a função uniqueResult() é chamada quando se sabe que o valor de retorno é um único registro. No nosso caso, como estávamos buscando pela chave primária, sabiamos que só haveria um único registro.
O objeto de retorno da função é do tipo Object. Sendo assim, tudo oq ue fiz foi um typecast para o tipo ControleDocumentosEmpresa, para que não tivessemos um erro de tipagem em nosso código.
A função uniqueResult() dispara uma excessão quando encontra mais de um resultado. Por esta razão é recomendada, pois caso isto ocorra, o DBA terá como fazer as alterações necessárias na base de dados para garantir a sua integridade.
Qualquer coisa, estou a disposição.
Um abraço! :)
ControleDocumentosEmpresa registro = (ControleDocumentosEmpresa) criteria.uniqueResult();
o que ela faz é o seguinte: a função uniqueResult() é chamada quando se sabe que o valor de retorno é um único registro. No nosso caso, como estávamos buscando pela chave primária, sabiamos que só haveria um único registro.
O objeto de retorno da função é do tipo Object. Sendo assim, tudo oq ue fiz foi um typecast para o tipo ControleDocumentosEmpresa, para que não tivessemos um erro de tipagem em nosso código.
A função uniqueResult() dispara uma excessão quando encontra mais de um resultado. Por esta razão é recomendada, pois caso isto ocorra, o DBA terá como fazer as alterações necessárias na base de dados para garantir a sua integridade.
Qualquer coisa, estou a disposição.
Um abraço! :)
GOSTEI 0
Cleiton Tavares.
22/01/2010
Entendi .
Mais uma vez ... valeu mesmo ....
Agora ta tudo resolvido, pelo menos por enquanto ; )
Pode fechar o chamado!!!
Abraço.
Mais uma vez ... valeu mesmo ....
Agora ta tudo resolvido, pelo menos por enquanto ; )
Pode fechar o chamado!!!
Abraço.
GOSTEI 0