Persistir com hibernate [Resolvido]

5 respostas
crpablo

Fala povo…

Eu to com um problema que é o seguinte…

Usando o hibernate, estou persistindo dados no bd a partir de xml gerados no backup desse banco.
Eu tenho uma tabela onde são persistidos os mapas do meu sistema, esses mapas são em forma de árvore, tem seus pais e filhos…
Porém quando eu vou persistir esses dados, por exemplo: a o mapa de ID = 1 que tem como pai o ID = 3, ele dá erro dizendo que o ID = 3 não foi encontrado, isso pq o mapa com esse id ainda não está persistido. Tem como resolver isso sem muito trabalho?

Alguém tem uma idéia?

5 Respostas

fiaux

Imagino que você tenha uma FK que aponta para a própria tabela, certo? Então quando você insere na coluna pai o id=3 e essa referência não existe o banco vai gritar mesmo. Se é isso que tá acontecendo, tira a FK. Talvez não seja a melhor das soluções.

crpablo

É isso mesmo que eu tenho aqui…

Deixa eu dar uma testada…

Já posto aki…

[]'s

crpablo

Não rolou naum cara… se eu tiro, não consigo nem inserir mais nenhum mapa, creio q seja pq quando inicio já tenho um mapa root, que é o pai de todos… :frowning:

fiaux

Bom, não sei exatamente como estão as coisas aí, mas entendo que você só poderá inserir quem já tem pai na base. Então vai ter que percorrer sua árvore da raiz até as folhas e inserindo. E mantenha sua FK

Retirando a FK o que aconteceu?

crpablo

Resolvido utilizando as mais altas técnicas de POG... :)

Map<Long, Long> idsPais = new HashMap<Long, Long>();

		Mapa root = dao.buscarRoot();

		// salva os ids dos mapas, e seta todos como sendo filhos do root
		for (Mapa mapa : paraPersistir) {
			if (mapa.getPai() != null) {
				idsPais.put(mapa.getId(), mapa.getPai().getId());
				mapa.setPai(root);
			}
		}

		// persiste mapas com os ids dos pais errados
		for (Mapa mapa : paraPersistir) {
			dao.makePersistent(mapa);
		}

		// corrige os ids dos pais
		for (Mapa mapa : paraPersistir) {
			if (mapa.getPai() != null) {
				mapa.setPai(dao.buscarMapa(idsPais.get(mapa.getId())));
			}
			dao.makePersistent(mapa);
		}

Valeu pela força ae fiaux!!!!
[]'s

Criado 5 de março de 2008
Ultima resposta 6 de mar. de 2008
Respostas 5
Participantes 2