Duvida: como duplicar um registro com o hibernate?

Pessoal, tenho um probleminha na mão… to precisando duplicar um objeto no banco, isto é, duplicar um registro de uma tabela, obviamente mudando apenas a chave primaria… alguém sabe como posso fazer isso no hibernate?

Oi André, e aí cara beleza?

Tipo, copiar e colar o valor não resolve não?

[quote=victorwss]Oi André, e aí cara beleza?

Tipo, copiar e colar o valor não resolve não?[/quote]

Hehehehe, eai victor, tudo tranquilo… nao cra, assim nao funciona… no hibernate o buraco é mais embaixo… infelizmente :frowning:

andre2k2,

e se voce der um new em um novo objeto que voce quer duplicar e passar o objeto jah salvo? e em seguida vc setar para null a chave e pedir para salvar? aih talvez o hibernate salve não?

pq axo q o que pega nessas operações no hibernate eh q se vc duplica um objeto e nao seta pra null a chave do duplicado, ele nao consegue salvar pois ele acusa que já tem um objeto com o mesmo identificador na sessão…

[quote=leonickel]andre2k2,

e se voce der um new em um novo objeto que voce quer duplicar e passar o objeto jah salvo? e em seguida vc setar para null a chave e pedir para salvar? aih talvez o hibernate salve não?

pq axo q o que pega nessas operações no hibernate eh q se vc duplica um objeto e nao seta pra null a chave do duplicado, ele nao consegue salvar pois ele acusa que já tem um objeto com o mesmo identificador na sessão…[/quote]
Não necessariamente. Se tiver mais de um objeto com a mesma chave primária carregado na sessão do Hibernate ao mesmo tempo, você pode sempre chamar suaSessao.evict(suaEntidade) e tornar seu objeto desatachado da sessão, embora exista uma linha no banco de dados que o representa. Neste estado as alteraçòes que você fizer ao objeto não serão refletidas no banco, pelo menos não enquanto você não reatachar o objeto na sessão com, por exemplo, um session.lock(Object suaEntidade, LockMode modo).

[quote=cassio][quote=leonickel]andre2k2,

e se voce der um new em um novo objeto que voce quer duplicar e passar o objeto jah salvo? e em seguida vc setar para null a chave e pedir para salvar? aih talvez o hibernate salve não?

pq axo q o que pega nessas operações no hibernate eh q se vc duplica um objeto e nao seta pra null a chave do duplicado, ele nao consegue salvar pois ele acusa que já tem um objeto com o mesmo identificador na sessão…[/quote]
Não necessariamente. Se tiver mais de um objeto com a mesma chave primária carregado na sessão do Hibernate ao mesmo tempo, você pode sempre chamar suaSessao.evict(suaEntidade) e tornar seu objeto desatachado da sessão, embora exista uma linha no banco de dados que o representa. Neste estado as alteraçòes que você fizer ao objeto não serão refletidas no banco, pelo menos não enquanto você não reatachar o objeto na sessão com, por exemplo, um session.lock(Object suaEntidade, LockMode modo).[/quote]

verdade, bem lembrado…mas aih no momento que eu reatachar um objeto na sessão com uma chave primária igual a de um outro que já esteja na sessão dará erro? ou dará erro soh no momento de persistí-lo no banco?

Olá caveira, acho que vc deve usar “suaSessão.replicate(…)” para duplicar o registro

Dá erro… Caso você tenha duas instâncias ao mesmo tempo carregadas, vc pode usar merge() ao invés de lock()

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

1 curtida