Clonar Objeto e usar JPA para persistência

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.

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

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á.

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:

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

vlw!

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

vlw![/quote]
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.

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.

[quote=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.
[/quote]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.

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.

Faça tipo assim:[code]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);[/code]

ok, vou testar aqui…

Obrigado!

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