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