Hibernate - Problemas para excluir

3 respostas
B

Pessoal, estou com o seguinte problema:

Para excluir uma entidade, o hibernate me obriga a ter uma instancia dela com seus campos not-null preenchidos. Caso contrário, ele dá erro.

Quando quero excluir uma entidade, devo passar o código dela e ela vai ser carregada antes de ser excluida, quando o normal seria necessitar apenas da PK para fazer a exclusão.

Faer um consulta até não seria tão ruim. Mas quando temos entidades que alto grau de relacionamento, ele obtém não somente a entidade a ser excluída, mas sim todas as entidades relacionadas, degradando a performance do sistema.

Poderiamos utilizar lazy loadind, mas como trabalho com WebServices, a utilidade do lazy cai por terra pois é necessário fazer serialização dos dados.

Alguem sabe alguma forma de resolver este problema.

A única solução que encontrei foi fazer ele executar um sql tipo:

Mas não seria a solução mais adequada.

[]`s

3 Respostas

B

Ninguém? :frowning:

D

também estou acompanhando este tópico na espera de uma resposta
:wink:

B

eu acabei optando por usar o sql...

public void excluir(Object entity) throws DataAccessException {
        try {
            //Obtém a classe persistente, que contem as informações sobre o mapeamento Entidade X Tabela
            PersistentClass persistentClass = RootDAO.getConfiguration().getClassMapping(entity.getClass());
            
            StringBuffer sqlBuffer = new StringBuffer();

            //Formata o SQL no formato "DELETE FROM NOME_DA_TABELA WHERE "
            sqlBuffer.append("DELETE FROM " + persistentClass.getTable().getName().toUpperCase() + " WHERE ");
        	Iterator keyIterator = null;
        	
        	//Se o identificador é único
        	if (!persistentClass.getIdentifierProperty().isComposite()) {
        	    //Gera Iterator de um elemento
        	    List item = new ArrayList();
        	    item.add(persistentClass.getIdentifierProperty());
        	    keyIterator = item.iterator();
        	} else {
        	    //Se não, gera Iterator com os identificadores
        	    keyIterator = ((Component)persistentClass.getIdentifier()).getPropertyIterator();    
            }

        	List parameters = new ArrayList();
        	
        	Object valor = null;
        	
    	    //Obtém o nome do Identificador da classe(Normalmente Codigo ou Id)
        	String identifier = persistentClass.getIdentifierProperty().getName();
    	    //Obtem o método get referente ao Identificador.
        	Method method = entity.getClass().getMethod("get"+identifier,new Class[]{});
        	//Invoca o método 
    	    valor = method.invoke(entity,new Object[]{});
        	while(keyIterator.hasNext()) {
        	    Property property = ((Property)keyIterator.next());
        	    
        	    //Nome do atributo da entidade 
        	    String propertyName = property.getName();
        	    //Coluna correspondente
        	    String columnName = ((Column)property.getValue().getColumnIterator().next()).getName();
        	    
        	    sqlBuffer.append(columnName.toUpperCase() + " = ? ");
        	    
        	    if (keyIterator.hasNext()){ 
        	        sqlBuffer.append(" AND ");
        	    }
        	    
        	    Object o = valor;
        	    
        	    //Caso o identificador não seja único
        	    if (persistentClass.getIdentifierProperty().isComposite()) {
        	        //Obtém o método get referente ao atributo do Identificador.
        	        method = o.getClass().getMethod("get"+propertyName,new Class[]{});
        	        //Invoca o método
        	        o = method.invoke(o,new Object[]{});
        	    }
        	    //Adiciona o resultado como parâmetro.
        	    parameters.add(o);
        	}
        	
        	//Cria um statement com o SQL gerado.
        	PreparedStatement preparedStatement = this.session.connection().prepareStatement(sqlBuffer.toString());
        	
        	Iterator iParameters = parameters.iterator();
        	int i = 1;
        	while (iParameters.hasNext()) {
        	    //Adiciona os parametros
        	    preparedStatement.setObject(i,iParameters.next());
        	    i++;
        	}
        	
        	//Executa o statement
        	preparedStatement.execute();
        	//Imprime o SQL gerado para o console
        	System.out.println("SQL: "+sqlBuffer.toString());
        	//this.session.delete(entity);
        } catch (Exception ex) {
            throw new DataAccessException("Não foi possível excluir o entity " + entity.getClass().getName() + ": " + ex.getMessage(), ex);
        }
    }
Criado 20 de abril de 2005
Ultima resposta 28 de abr. de 2005
Respostas 3
Participantes 2