Ajuda MVC (JSF + Hibernate)

1 resposta
WashingtonBotelho

Olá galera,

Estou estudando JSF + Hibernate e até o ponto no qual eu gravava uma tabela somente corria tudo bem, mas quando tive de usar tabelas relacionadas com @Annotation comecei a ter problemas.

Entity Usuario:
@Entity
public class Usuario implements Serializable {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private int codUsuario;
  private int num;
  private String nome;
  private String sobrenome;
  private String cpf;
  private String sexo;
  private String tel;
  private String cel;
  private String rua;
  private String bairro;
  private String compl;
  private String cidade;
  private String uf;
  private String cep;
  //
  @Temporal(javax.persistence.TemporalType.DATE)
  private Date nascimento;
  //
  @OneToOne(cascade = CascadeType.ALL)
  @JoinColumn(name = "codLogin")
  private Login login;
  //
  @OneToOne(cascade = CascadeType.ALL)
  @JoinColumn(name = "codUserInfo")
  private UsuarioInfo usuarioInfo;
// getters and setters
Entity Login:
@Entity
public class Login implements Serializable {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private int codLogin;
  private String usuario;
  private String senha;
  private String email;
  private String tipo;
Entity UsuarioInfo:
@Entity
public class UsuarioInfo implements Serializable {

  @Id
  @GeneratedValue(strategy = GenerationType.AUTO)
  private int codUserInfo;
  private int qtdFilme;
  private int ptPositivo;
  private int ptNeutro;
  private int ptNegativo;
  private int qtdTopico;
  private int qtdMsg;
  private String avatar;
  @Temporal(javax.persistence.TemporalType.DATE)
  private Date dataCadastro;
  @Temporal(javax.persistence.TemporalType.DATE)
  private Date dataVisita;
  private Time horaVisita;
  private boolean disponivel;
  private boolean travado;
Controller UsuarioApl:
public class UsuarioApl {

  private Usuario usuario;
  private UsuarioDao usuarioDao;

  public String novoUsuario() {
    usuario = new Usuario();
    return "novoUsuario";
  }

  public String cadastrar() {
    System.out.println("Nome: " + usuario.getNome());
    usuarioDao.cadastrar(usuario);
    return "cadastrado";
  }

  public Usuario getUsuario() {
    return usuario;
  }

  public void setUsuario(Usuario usuario) {
    this.usuario = usuario;
  }
}
Dao UsuarioDao:
public class UsuarioDao implements Dao {

  private Session session;
  private Transaction tx = null;

  public void cadastrar(Object obj) {
    session = HibernateUtil.getSession();

    try {
      tx = session.beginTransaction();
      session.save(obj);
      tx.commit();
    } catch (Exception e) {
      System.out.println("[UsuarioDao.cadastrar] Erro: " + e.toString());
      tx.rollback();
    } finally {
      session.flush();
      session.close();
    }
  }

  public void alterar(Object obj) {
    throw new UnsupportedOperationException("Not supported yet.");
  }

  public void remover(Object obj) {
    throw new UnsupportedOperationException("Not supported yet.");
  }

  public Object consultar(Object obj) {
    throw new UnsupportedOperationException("Not supported yet.");
  }

  public List<?> listar(int max, int atual) {
    throw new UnsupportedOperationException("Not supported yet.");
  }
}
Dúvidas:

1. No início estava acusando de nullpoint no Login e no UsuarioInfo, pois eles não tinha sido istânciados. Mas realmente não, pois eles são apenas declarados na classe e só istancio o Usuario quando executo o método novo(). Eu devo istanciar as outras classes direto em vez de só private Login login; ?

org.apache.jasper.el.JspPropertyNotFoundException: /salvarUsuario.jsp(17,10) '#{usuarioApl.usuario.usuarioInfo.avatar}' Target Unreachable, 'usuarioInfo' returned null
@OneToOne(cascade = CascadeType.ALL)
  @JoinColumn(name = "codUserInfo")
  private UsuarioInfo usuarioInfo = new UsuarioInfo();
ou
@OneToOne(cascade = CascadeType.ALL)
  @JoinColumn(name = "codUserInfo")
  private UsuarioInfo usuarioInfo;

2. Quando eu uso @JoinColumn e mappedBy?

3. Em UsuarioDao eu posso passar pro save o Object mesmo ou tenho de fazer um case para Usuario?

4. E por fim, como com certeza estou fazendo errado, esta dando nullpoint no método cadastrar:

HTTP Status 500 - 

--------------------------------------------------------------------------------

type Exception report

message 

description The server encountered an internal error () that prevented it from fulfilling this request.

exception 

javax.servlet.ServletException: #{usuarioApl.cadastrar}: java.lang.NullPointerException
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:256)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)


root cause 

javax.faces.FacesException: #{usuarioApl.cadastrar}: java.lang.NullPointerException
	com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:107)
	javax.faces.component.UICommand.broadcast(UICommand.java:383)
	javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:447)
	javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:752)
	com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
	com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)


root cause 

javax.faces.el.EvaluationException: java.lang.NullPointerException
	javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:91)
	com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
	javax.faces.component.UICommand.broadcast(UICommand.java:383)
	javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:447)
	javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:752)
	com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
	com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)


root cause 

java.lang.NullPointerException
	com.moviecollection.controller.UsuarioApl.cadastrar(UsuarioApl.java:24)
	sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
	sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
	java.lang.reflect.Method.invoke(Method.java:597)
	org.apache.el.parser.AstValue.invoke(AstValue.java:172)
	org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:276)
	org.apache.jasper.el.JspMethodExpression.invoke(JspMethodExpression.java:68)
	javax.faces.component.MethodBindingMethodExpressionAdapter.invoke(MethodBindingMethodExpressionAdapter.java:77)
	com.sun.faces.application.ActionListenerImpl.processAction(ActionListenerImpl.java:91)
	javax.faces.component.UICommand.broadcast(UICommand.java:383)
	javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:447)
	javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:752)
	com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:97)
	com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
	org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:390)

Se alguém puder me ajudar, ficarei muito grato. Obrigado pessoal. :)

1 Resposta

WashingtonBotelho

Bem pessoal, estou até agora tentando aqui e descobri coisas interessantes, porém não sei o porquê.

  1. As chaves primárias devem ser Long (não int e nem long).

  2. Na classe Usuario onde tem declarado Login e UsuarioInfo o objeto deve ser istanciado e não apenas declarado.

  3. Agora estou vendo o cado do update, que se eu enviar a mesma consulta ele da update somente no Login e no UsuarioInfo e um insert no Usuario.

Mas valeu ai à ninguém né… =\

[Editado]

Bem ‘moscas’ eu resolvi o problema que estava tendo ao clicar na tabela para ir para página para atualizar os dados. Na hora que eu retorno um dataModel, eu tenho de setar o valor primeiro para deixa-lo disponível, para depois retorna, e eu estava retornando direto, assim ele não ficava armazenada na Apl para futuras consultas.

Quanto a dúvida 2. permanecel, mas como agora eu usei render para aparecer o botão cadastrar ou atualizar, isto foi contornado.

* Eu não sei o que acontece, mas minhas dúvidas ninguém ousa nem tentar ajudar. Chumbo trocado não é, pois tento ao máximo ajudar a todos na medida do possível.
Sinceramente, não voltarei postar aqui no GUJ minhas dúvidas tão cedo. Obrigado a todos que já me ajudaram.

Criado 6 de dezembro de 2008
Ultima resposta 6 de dez. de 2008
Respostas 1
Participantes 1