SessionScoped + JPA

Estou trabalhando com objetos na sessão e todos eles gerenciado pelo VRaptor, e o meu fluxo de cadastro e edição no banco de dados só é feito quando o usuário clica em salvar, ou seja, toda modificação que o usuário faz no objeto fica na sessão.

Como estou usando JPA ficou fácil salvar e editar, pois a JPA faz todo o trabalho “manual”, que é inserir todos os filhos de uma entidade e etc…

O meu problema seria na hora da remoção, tenho objetos que possuem listas e relacionamentos com outros objetos, quando eu removo um objeto da lista nada acontece (o objeto continua no banco), sendo que eu não estou chamando o método remove do entityManager, o mesmo tem que ser chamado? A JPA não deveria detectar que um objeto foi removido da lista ou a sua referência perdida e tirar ele do banco?

Se eu tenho que chamar o método remove, em que momento eu tenho que fazer isso? Pois o usuário altera o objeto na sessão e só no final do processo que o mesmo é persistido. Gostaria ver as soluções que o pessoal usa por ai…

Desde já agradeço a ajuda de todos.

Então, a Lista é uma das pontas do relacionamento…

E existe uma ponta fraca (que tá lá só pra facilitar a vida) e a ponta forte (que garante o relacionamento de verdade)

se a lista estiver anotada com @*ToMany(mappedBy=“outroCampo”) ela é a ponta fraca.

Por isso, vc precisa setar null nesse “outroCampo” para que o elemento saia da lista.

Lucas, valeu pela resposta.

Estive fazendo várias pesquisas sobre o assunto depois que postei a minha dúvida aqui no fórum e faltavam algumas anotações no meu bean, como cascade e orphanRemoval.

Depois de anotar corretamente tudo funcionou conforme o esperado, quando eu tiro um objeto da lista o entitymanager se encarrega de tirar o objeto do banco.

Aproveitando o tópico como você faz para testar esse cenário que o objeto está na sessão? Existe alguma integração do JUnit com o VRaptor para simular a sessão?

sessão vc diz a HttpSession, ou a Session do hibernate?

Eu estava me referindo ao HttpSession, mas vc acabou me mostrando que eu preciso dos dois (HttpSeesion e EntityManager) se eu quiser testar end-to-end.

Aqui acaba entrando uma duvida meio conceitual, neste caso eu só tenho q testar a minha controller do VRaptor que trabalha com a minha sessão? Oi testo todo fluxo?

a menos que vc interaja diretamente com o HttpSession, não vejo motivo para simular a sessão.

Teste as classes como classes Java normais.

Agora se quiser um end to end mesmo vc precisa subir o projeto num servidor (pode ser um jetty embeddado por exemplo) e fazer requisições para ele (tipo usando um selenium da vida)