Hibernate - Problemas para excluir

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

Ninguém? :frowning:

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

eu acabei optando por usar o sql…

[code]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);
    }
}

[/code]