Ajuda MVC (JSF + Hibernate)

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:[code]@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[/code]

Entity Login:[code]@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;[/code]
Entity UsuarioInfo:[code]@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;[/code]
Controller UsuarioApl:[code]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;
}
}[/code]
Dao UsuarioDao:[code]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.”);
}
}[/code]
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;

  1. Quando eu uso @JoinColumn e mappedBy?

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

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

[code]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)[/code]

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

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.