Atualização das chaves removidas no Hibernate

5 respostas
crpablo

Fala galerinha...

O que eu to fazendo é o seguinte:

No meu sistema tem um cadastro de mapas(localidade onde fica um equipamento) e dentro desse mapa são cadastrados equipamentos.... 1 ou mais...
Esses equipamentos possuem alguma opções a serem selecionadas no momento do cadastro, ou mesmo em uma edição posterior.

O meu problema está sendo o seguinte, quando eu cadastro, por exemplo, 3 equipamentos, os mesmos me gerariam 6 opções cadastradas. As chaves dessas opcoes seriam 1,2,3,4,5,6. Quando eu deleto o equipamento 2, as chaves 3 e 4 são apagadas, permanecendo 1,2,5,6 no bd... até aí tudo bem.
Eu exporto esses dados para um XML(para uma mudança de bd ou backup) e ele exporta corretamente, somente as chaves 1,2,5,6. Porém quando eu deleto meu banco e vou importar esses dados do XML a chave fica da seguinte maneira: 1,2,3,4... ou seja... ele atualiza as chaves de maneira sequencial e quando o hibernate procura pela chave 5 ele me gera e seguinte exception:

javax.persistence.EntityNotFoundException: Unable to find model.OpcaoEquipamento with id 5

Alguém tem uma idéia de como resolver isso?...

Segue minhas class:

Equipamento.java
@Entity
public class Equipamento extends Elemento {
...
...
...
    @OneToMany(targetEntity = OpcaoEquipamento.class)
	@Cascade( { CascadeType.ALL, CascadeType.DELETE_ORPHAN })
	@LazyCollection(value = LazyCollectionOption.FALSE)
	public Set<OpcaoEquipamento> getOpcoes() {
		return opcoes;
	}

	public void setOpcoes(Set<OpcaoEquipamento> opcao) {
		this.opcoes = opcao;
	}
...
...
...
OpcaoEquipamento.java
@Entity
public class OpcaoEquipamento extends CiaEntity {
...
...
...
    @Id
	@GeneratedValue(generator = "sequence")
	@GenericGenerator(name = "sequence", strategy = "increment")
	public Long getId() {
		return super.getId();
	}
...
...
...
Equipamento_OpcaoEquipamento.java
@Entity
public class Equipamento_OpcaoEquipamento extends CiaEntity {
...
...
...
    @Id
	private long opcoes_id;
	private long equipamento_id;
...
...
...

Acho que é isso...

To quebrando a cabeça com isso... =S

[]'s

5 Respostas

_fs

E por que o Hibernate continua a procurar pela pk com valor 5?

Ao deletar tudo do banco você reseta também as sequences?

crpablo
Filipe Sabella:
E porquê o Hibernate continua a procurar pela pk com valor 5?

Ao deletar tudo do banco você reseta também as sequences?

Fala Filipe...

Essa é a classe q tah procurando o ID = 5.....
@Entity
public class Equipamento_OpcaoEquipamento extends CiaEntity {

	@Id
	private long opcoes_id;
	private long equipamento_id;

	public Equipamento_OpcaoEquipamento() {
		// TODO Auto-generated constructor stub
	}

	public long getEquipamento_id() {
		return equipamento_id;
	}

	public void setEquipamento_id(long equipamento_id) {
		this.equipamento_id = equipamento_id;
	}

	public long getOpcoes_id() {
		return opcoes_id;
	}

	public void setOpcoes_id(long opcoes_id) {
		this.opcoes_id = opcoes_id;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ (int) (equipamento_id ^ (equipamento_id >>> 32));
		result = prime * result + (int) (opcoes_id ^ (opcoes_id >>> 32));
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		final Equipamento_OpcaoEquipamento other = (Equipamento_OpcaoEquipamento) obj;
		if (equipamento_id != other.equipamento_id)
			return false;
		if (opcoes_id != other.opcoes_id)
			return false;
		return true;
	}
}

Quanto a sequence, não to resetando... na real nem sei como se faz isso...

[]'s

_fs

Vamos seguir a sequência?

  1. Usuário quer importar o banco do arquivo
  2. Aplicação deleta todos os registros
  3. Aplicação insere os registros a partir do arquivo
  4. Aplicação comita a transação

Até aí está certo? Se sim, de onde está saindo esse id 5?

crpablo

Filipe Sabella:
Vamos seguir a sequência?

  1. Usuário quer importar o banco do arquivo
  2. Aplicação deleta todos os registros
  3. Aplicação insere os registros a partir do arquivo
  4. Aplicação comita a transação

Até aí está certo? Se sim, de onde está saindo esse id 5?

Bora…

1 - Ok
2 - Eu deleto a base e crio novamente
3 - A partir dos XML’s
4 - Pega o XML 1 comita, XML 2 comita, etc…

Eu importei os arquivos 1 por 1, e é quando eu importo Equipamento_OpcaoEquipamento que ele procura por esse ID 5…

crpablo

O que eu to precisando mesmo, é que na hora de fazer o import, o hibernate não atualize as chaves das opções.
Acho que ele deveria persistir no bd com as chaves 1,2,5,6, assim não teria problemas com os outros imports.

Alguém?

[]'s

Criado 7 de abril de 2008
Ultima resposta 9 de abr. de 2008
Respostas 5
Participantes 2