Clonar Objeto e usar JPA para persistência

11 respostas
J

Prezados,

Estou necessitando cria uma cópia de um objeto para que o atual seja setados alguns valores e salvo no BD e a cópia seja salvo como uma nova instancia com um novo ID e com os parâmetros como null.

Qual a melhor forma?

O Objeto que tenho atual ele não possui a propriedade .clone()

Alguma sugestão? estou usando JPA.

Desde já agradeço.

11 Respostas

R

Cara, tem como você explicar melhor? talvez com um exemplo. Não ficou muito claro pra mim.

J

Tenho o objeto1, e quero criar o objeto2 igual ao 1 porém com alguns dados diferentes então faço o seguinte:

objeto1.datafinal = new Date();
objeto1.finalizado = true;
objeto1.datasolicitacao = new Date();
objeto1.save();

Classe objeto2 = Objeto1;
objeto2.id = //Deveria ter um novo ID e não o ID do Objeto 1 como esta ficando
objeto2.datafinal = null;
objeto2.finalizado = false;
objeto2.datasolicitacao = null;
objeto2.save();

Pensei em fazer algo do tipo:

Mas este clone() não exite no objeto.

Espero que tenha explicado de forma mais objetiva agora.

Obrigado, desde já.

R

tem a API Commons BeanUtils que pode te ajudar. ela copia os atributos de um objeto a outro. Ex:BeanUtils.copyProperties(objeto1, objeto2)Aí depois você teria que alterar os valores que quer na mão.

EDIT: outra solução é você implementar esse método clone() da maneira que quiser. :wink:

J

Valeu a segunda opção foi a que também pensei, mas vou optar pela 1ª opção que mostrou…

vlw!

R

jeroqueiroz:
Valeu a segunda opção foi a que também pensei, mas vou optar pela 1ª opção que mostrou…

vlw!


Dependendo do caso, eu sugiro a segunda opção, pois você pode copiar apenas os atributos que te interessam, sendo que no primeiro caso, vai copiar todos, e setar alguns na mão, todas as vezes que quiser clonar.

J

A Questão é que quero todos somente duas datas que irei setar como NULL e o ID que terei q usar o próximo a ser gerado, melhor que criar um clone que quando por algum motivo entrar mais atributos no model teria que ficar alterando o método clone, sendo que com a 1ª opção não vejo este necessidade, já estaria contemplado.

H

jeroqueiroz:
A Questão é que quero todos somente duas datas que irei setar como NULL e o ID que terei q usar o próximo a ser gerado, melhor que criar um clone que quando por algum motivo entrar mais atributos no model teria que ficar alterando o método clone, sendo que com a 1ª opção não vejo este necessidade, já estaria contemplado.
Seria melhor então vc fazer um new no “clone” e alterar o necessário sem passar o ID.
Parece que você não precisa de um clone dito e feito, mas sim de uma outra instância com apenas alguns dados iguais.

J

Na verdade quero um clone com dois atributos diferentes e um novo ID pois será persistido como um novo objeto, ou seja será os mesmos dados para objeto1 e objeto2, diferenciando apenar:

Objeto1:

dataInicio = new Date();
dataFim = new Date();

Objeto2:

dataInicio = null;
dataFim = null;
id = //novo ID;
objeto1.save();
objeto2.save();

sendo dois objetos de ID’s diferentes no Banco.

H
Faça tipo assim:
public class Dog{
    public Dog duplicate(){
        Dog dog = new Dog();
        dog.setNome(this.nome);
        // coloca tudo q é devido
        return dog;
    }
}

//e na hora de usar
entityManager.save(dog1);
Dog dog2 = dog1.duplicar();
entityManager.save(dog2);
J

ok, vou testar aqui…

Obrigado!

L

RESOLVIDO.

Sei que o tópico é antigo mas tenho certeza que outras pessoas precisam e precisarão disto. Então para quem necessitar eu criei uma lib que resolve esse problema e de forma automática. Copiando inclusive os relacionamentos da entidade, os relacionamentos dos relacionamentos, etc… enfim, todo o contexto de persistencia da entidade baseado nas anotações do pacote javax.persistence.

Expliquei tudo e disponibilizei o jar e os fontesno post no meu blog, abaixo:

http://lindbergframework.blogspot.com.br/2013/08/como-criar-uma-copia-de-um-objeto.html

Espero ter ajudado

Criado 14 de maio de 2012
Ultima resposta 23 de ago. de 2013
Respostas 11
Participantes 4