Caros, bom dia.
Existe alguma alternativa ao merge?
Eu preciso trabalhar com objetos desacoplados, e o merge em uma incomoda situação ele não resolve o meu problema para reatar um objeto à sessão.
Bom, hoje eu utilizo o padrão OpenSessionInView para controlar o problema do lazy loading exception. Apesar de resolver a maioria dos problemas, me deparei com uma situação inusitada, que o merge não resolve. O situação é a seguinte:
Primeiro Momento: pesquiso uma lista de Pedidos, seleciono um e peço para editar esse Pedido. Uma outra view é aberta com a descrição do Pedido selecionado que por sua vez também tem uma lista de Itens.
Segundo Momento: seleciono um desses Itens e peço para edita-lo. Uma outra view é aberta com a descrição do Item selecionado. O problema aparece aqui. Quando eu faço um merge ele retorna para mim uma nova instancia com os dados atualizados e anexado a sessão. Até aqui tudo bem, a view é preenchida com os dados e não tenho problema com o lazy loading exception. Porém esse item, por ele ser uma instancia nova, a lista de itens do pedido não faz referência para esse item que foi feito o merge. Ou seja, Existem duas referências para o mesmo item. Neste caso o item que eu fiz o merge irá se perder, pois quando eu salvar o pedido ele não será salvo em cascata.
Obs.: Para resolver isso, hoje eu realizo um session.update(itemSelecionado), uma vez que o update não cria uma nova instancia. Porém ao renderizar a view de descrição de um Item para o usuário, a transação é commitada e os dados são atualizados no banco.
Alguma solução?