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
também estou acompanhando este tópico na espera de uma resposta

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]