Tenho uma aplicação WEB usando JBOSS 7.1.1 AS, JPA (hibernate do JBOSS), JSF e acesso via JAAS. Depois da validação do login via JAAS faço o redirecionamento para uma página simples que deveria exibir os dados do usuário logado. Contudo quando executo o find para recuperar o usuário logado o hibernate faz um update do objeto que acabei de recuperar (ver console abaixo).
Trecho de código executado no meu bean
...
@EJB
private UsuarioDAO usuarioService;
// ******************** Atributos ********************
private Usuario usuario;
private String imagem = "119.jpg";
public Usuario getUsuario()
{
if(usuario == null)
{
ExternalContext context = FacesContext.getCurrentInstance().getExternalContext();
String username = context.getUserPrincipal().getName();
usuario = usuarioService.findUserByUsername(username); // <<<< AQUI!!!
}
return usuario;
}
...
Saída da console do Eclipse
17:59:09,557 INFO [stdout] (http-localhost-127.0.0.1-8080-2) Hibernate:
17:59:09,561 INFO [stdout] (http-localhost-127.0.0.1-8080-2) SELECT
17:59:09,565 INFO [stdout] (http-localhost-127.0.0.1-8080-2) *
17:59:09,568 INFO [stdout] (http-localhost-127.0.0.1-8080-2) FROM
17:59:09,571 INFO [stdout] (http-localhost-127.0.0.1-8080-2) Usuario u
17:59:09,575 INFO [stdout] (http-localhost-127.0.0.1-8080-2) WHERE
17:59:09,578 INFO [stdout] (http-localhost-127.0.0.1-8080-2) u.username = 'marcelo.magalhaes';
17:59:09,951 INFO [stdout] (http-localhost-127.0.0.1-8080-2) Hibernate:
17:59:09,954 INFO [stdout] (http-localhost-127.0.0.1-8080-2) update
17:59:09,958 INFO [stdout] (http-localhost-127.0.0.1-8080-2) usuario
17:59:09,961 INFO [stdout] (http-localhost-127.0.0.1-8080-2) set
17:59:09,965 INFO [stdout] (http-localhost-127.0.0.1-8080-2) ativo=?,
17:59:09,968 INFO [stdout] (http-localhost-127.0.0.1-8080-2) id_classificacaoProfissional=?,
17:59:09,973 INFO [stdout] (http-localhost-127.0.0.1-8080-2) dataAdmissao=?,
17:59:09,976 INFO [stdout] (http-localhost-127.0.0.1-8080-2) dataDemissao=?,
17:59:09,980 INFO [stdout] (http-localhost-127.0.0.1-8080-2) id_disciplina=?,
17:59:09,984 INFO [stdout] (http-localhost-127.0.0.1-8080-2) email=?,
17:59:09,988 INFO [stdout] (http-localhost-127.0.0.1-8080-2) id_faixaSalarial=?,
17:59:09,992 INFO [stdout] (http-localhost-127.0.0.1-8080-2) matricula=?,
17:59:09,996 INFO [stdout] (http-localhost-127.0.0.1-8080-2) nome=?,
17:59:09,999 INFO [stdout] (http-localhost-127.0.0.1-8080-2) password=?,
17:59:10,003 INFO [stdout] (http-localhost-127.0.0.1-8080-2) username=?
17:59:10,006 INFO [stdout] (http-localhost-127.0.0.1-8080-2) where
17:59:10,010 INFO [stdout] (http-localhost-127.0.0.1-8080-2) id=?
UsuarioDAO
...
public Usuario findUserByUsername(String username)
{
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("username", username);
return (Usuario) super.retrieveByNamedQueryWithOneResult(Usuario.FIND_BY_USERNAME, parameters); <= SELECT + UPDATE
//return (Usuario) super.findByNativeQuery("SELECT * FROM Usuario u WHERE u.username = '" + username + "';", Usuario.class).get(0); <= SÓ O SELECT
}
...
Usuario (objeto)
...
@NamedQuery(name = "Usuario.findUserByUsername", query = "SELECT u FROM Usuario u WHERE u.username = :username")
...
Página JSF user.hxtml
...
<h:body>
<h:graphicImage value="images/#{usuarioManagedBean.imagem}" title="Marcelo" />
<p:outputLabel value="#{usuarioManagedBean.usuario.nome}" /><br/>
<p:outputLabel value="#{usuarioManagedBean.usuario.id}" /><br/>
<p:outputLabel value="#{usuarioManagedBean.usuario.ativo}" /><br/>
<p:outputLabel value="#{usuarioManagedBean.usuario.username}" /><br/>
<p:outputLabel value="#{usuarioManagedBean.usuario.password}" /><br/>
<p:outputLabel value="#{usuarioManagedBean.usuario.matricula}" /><br/>
<p:outputLabel value="#{usuarioManagedBean.usuario.nome}" /><br/>
<p:outputLabel value="#{usuarioManagedBean.usuario.email}" /><br/>
<p:outputLabel value="#{usuarioManagedBean.usuario.dataAdmissao}">
<f:convertDateTime pattern="dd/MM/yyyy" />
</p:outputLabel><br/>
<p:outputLabel value="#{usuarioManagedBean.usuario.dataDemissao}">
<f:convertDateTime pattern="dd/MM/yyyy" />
</p:outputLabel><br/>
</h:body>
...
P.S. não se preocupem com os nome trocados DAO e Service… é que antes o projeto não tinha DAOs os Services é que fazia a parte de SQL… estou adicionando a camada de DAO (que na verdade era o meu antigo Servcice).
Não sei o que está acontecendo… quando faço o SQL nativo (ver linha comentada no DAO) tudo funciona ok. E tem mais… ele executa este select + update 10 vezes que são a quantidade de atributos do meu objeto usuário. Já teste reduzir os atributos e ele reduz os selects… isso pode ser devido ao fato do bean ser RequestScoped… ele está fazendo um request para cada atributo do págins JSF.
Abraços a todos.