Problema com delete no hibernate (one-to-many) List

3 respostas
C

Olá Pessoal,

Estou utilizando o XDoclet, Hibernate com Mysql.
Crei duas classes pai(Usuario) - filha(Sistema) na classe pai declarei o seguinte:
/**
* @hibernate.list
* cascade=“all”
* @hibernate.collection-one-to-many
* class=“acesso.Sistema”
* @hibernate.collection-index
* column=“idIndice”
* @hibernate.collection-key
* column=“idUsuario”

para apagar um sistema fiz este método:

public boolean apagaSistema(Sistema vSis) {

try {

sessao = sf.openSession();

trans = sessao.beginTransaction();

sessao.delete(vSis);

trans.commit();

System.out.println("Apaga sistema. "+vSis.getSigla());

return true;

} catch (HibernateException e) {

return false;

}

}

A inclusão funciona beleza, mas quando vou deletar um sistema o campo
idIndice não se refaz. Irei exemplificar:
Incluir 3 registros em sistemas para um determinado Usuario então o idIndice do último registro fica igual a 2 (começa em zero), quando eu excluo o 2o. registro deveria o list.size() ser igual a 2, mas ele devolve 3, pois ele pega o valor do idIndice+1 do último Sistema para um determinado Usuario.

Como faço para apagar sistema atualizando o idIndice ?

Por favor agradeço qualquer idéia. :wink:

Até mais.

Fabrício Luis.

3 Respostas

maxguzenski

bah cara, eu conheço razoavelmente bem hibernate…
mas eu juro que tentei entender o q tu quer fazer, mas nao consegui :stuck_out_tongue:

C

Olá Maximiliano,

Obrigado pelo interesse. :wink:
Tentarei ser mais claro. Quando você cria o relacionamento acima descrito com Hibernate utilizando uma Lista, ele criará uma coluna na tabela do banco de dados para controle de índice.
@hibernate.collection-index column=“idIndice”
A tabela Sistema(filha) é agrupada por Usuario(pai), então esta coluna
idIndice é vinculada ao Usuario (pai), ou seja, quando um novo Usuario é
criado esta coluna começa do 0 (zero).

Exemplo simples no banco: Tabela Sistema

ID DescSistema idUsuario idIndice
1 Almoxarifado 1 0
2 Patrimonio 1 1
3 Contabil 1 2
4 Financeiro 2 0
5 Contabil 2 1

Apaguei o registro 2, a tabela ficará assim:

ID DescSistema idUsuario idIndice
1 Almoxarifado 1 0
3 Contabil 1 2
4 Financeiro 2 0
5 Contabil 2 1

Note que o Usuario 1 tem somente agora 2 sistemas, e o idIndice ficou
uma brecha. Quando vou carregar uma List dos Sistemas do Usuário 1 o método List.size fica igual a 3 pois retorna o valor do último idIndice+1 do usuário 1, mesmo ele tendo apenas dois registros vinculados a ele.
Se eu alterar na munheca o idIndice do registro 3 para 99, ele retornaria
List.size() = 100

Estou usando o struts quando vou listar o conteúdo dos classe Sistema(filha) carrego ela em uma List, na hora
que vou mostrá-la uso logic:iterate do Struts, ele varre uma List do início até o
tamanho dela (List.size), então utilizando o exemplo acima ele fará um
loop três vezes sendo que deveria rodar somente duas vezes, pois só
existe 2 sistemas para o Usuario 1.

Como faço para apagar um registro utilizando o Hibernate que atualize
esta coluna de índice?

Qualquer outro solução será muito bem-vinda.
Agradeço desde já o seu interesse.

Até mais.
Fabrício Luis

C

Olá Pessoal

Descobri uma solução que é em vez de usar (list) use (bag).

/**

  • @hibernate.list
  • cascade=“all”

use

/**

  • @hibernate.bag
  • cascade=“all”

pois não irá criar um campo de ordenação de índices.

Até mais.
Fabrício Luis
http://www.ce3po.com

Criado 7 de outubro de 2004
Ultima resposta 13 de out. de 2004
Respostas 3
Participantes 2