tela de alteracao voce tera que consultar a entidade no banco e exibir as informacoes atuais na tela. Quando voce faz isso voce carrega a entidade em uma sessao Hibernate, provavelmente usando o metodo load ou get e fecha a sessao ao exibir esses dados para alteracao. Quando a entidade e submetida para ser alterada ela e considerada Detatched. A entidade Detached um dia ja fez parte de outro grupo (sessao hibernate antiga), mas nao faz parte desta (sessao hibernate atual). Ela e diferente de uma entidade Persistent, que e uma entidade que esta na sessao e tem identificador valido dentro da sessao atual. Esse e um estado enjoado. Considere a situacao relatada acima. Se voce for usar o metodo save ou update para persistir essa entidade voce pode se deparar com alguns problemas. O Hibernate so admite em sua sessao no maximo 1 objeto por ID. E se voce ja tiver uma entidade carregada na sessao atual com o mesmo identificador da entidade Detatched que voce esta submetendo, voce provavelmente ira receber isso: "nested exception is org.hibernate.NonUniqueObjectException: a different object with the same identifier value was already associated with the session:..." Essa excecao seria o mesmo que o Hibernate, que e o comandante do grupo, dizer: Voce nao pode entrar nesse grupo, ja existe alguem aqui com essa identificacao!!. Veja que fantastico isso e para entender um pouco do funcionamento do Hibernate. Provavelmente voce so passou os olhos em cima de um item interessantissimo, entao vou repeti-lo: "O Hibernate so admite em sua sessao no maximo 1 instancia de classe por ID.". Apenas um objeto por classe e ID*. Por isso o get(Class, Serializable) e como se fosse um mapa. Como se fosse, nao e um mapa. Entao voce devera usar algumas taticas para contornar isso. Uma solucao seria atribuir os dados alterados na instancia da sessao atual, por exemplo: //Obtendo a entidade ativa (a entidade com identificador valido dentro da sessao)Entidade entidadeAtiva = sess.load(Entidade.class, entidadeDetached.getId()); //Atribuindo alteracoes que voce deseja persistir na entidade ativaentidadeAtiva.setValor1(entidadeDetached.getValor1()); entidadeAtiva.setValor2(entidadeDetached.getValor2()); sess.save(entidadeAtiva); Assim as alteracoes feitas na entidade Detatched podem ser sincronizadas com a entidade ativa. Porem nesse caso poderia ser utilizado o metodo merge() que faz exatamente o mesmo so que automaticamente. Veja que simples: sess.merge(entidadeDetached); Segundo a Documentacao oficial do Hibernate, o comportamento do merge e o seguinte: Se houver uma instancia persistente com o mesmo identificador atualmente associado com a sessao, copia o estado do objeto para o estado da instancia persistente Se nao houver nenhuma instancia persistente atualmente associada com a sessao, tenta carrega-lo a partir do banco de dados, ou criar uma nova instancia persistente a instancia persistente e retornada a instancia dada nao e associada com a sessao, continua detatched. O merge entao nos salva desse problema, mas como vimos no artigo, poderemos ter outros pepinos para nos preocupar. Mas esse do Detached agora voce ja sabe. *Em outro artigo poderemos falar sobre mapeamento de entidades e vera como utilizar a notacao @Id para definir um atributo como identificador da entidade. Referencias: http://docs.jboss.org/hibernate/core/3.3/reference/en/html/index.html http://docs.jboss.org/hibernate/entitymanager/3.5/reference/en/html/objectstate.html#d0e1318