Fórum Hibernate não deleta #14451

22/01/2010

0

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);
Cleiton Tavares.

Cleiton Tavares.

Responder

Posts

22/01/2010

Henrique Weissmann

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();
Responder

Gostei + 0

22/01/2010

Cleiton Tavares.

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
Responder

Gostei + 0

22/01/2010

Henrique Weissmann

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.
Responder

Gostei + 0

22/01/2010

Cleiton Tavares.

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.



Responder

Gostei + 0

22/01/2010

Henrique Weissmann

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! :)
Responder

Gostei + 0

22/01/2010

Cleiton Tavares.

Entendi .
Mais uma vez ... valeu mesmo ....

Agora ta tudo resolvido, pelo menos por enquanto ; )

Pode fechar o chamado!!!

Abraço.


Responder

Gostei + 0

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar