Dúvidas com JPA

7 respostas
R

Boa noite amigos, Meu nome é rodrigo, estou aprendendo a mexer com jpa, entao começei tentando fazer um cadastro de controle de ligações:
primeiro criei um banco no MySQL chamado telefonemas, neste banco eu tenho uma tabela com as colunas, usuario (PK), login, senha, nome.
Bom agora estou tentando fazer a validação do usuario pra poder acessar minha aplicação, pra isso preciso acessar meu banco.
para começar a mexer com o banco, primeiro eu usei o assistente do netbeans para montar o persistence.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
  <persistence-unit name="TelefonemasWebPU" transaction-type="RESOURCE_LOCAL">
    <provider>oracle.toplink.essentials.PersistenceProvider</provider>
    <properties>
      <property name="toplink.jdbc.user" value="root"/>
      <property name="toplink.jdbc.password" value="root"/>
      <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/telefonemas"/>
      <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/>
      <property name="toplink.ddl-generation" value="create-tables"/>
    </properties>
  </persistence-unit>
</persistence>

depois o nb parece que ja pegou minha tabela e criou um arquivo .dbschema, e varios outros arquivos…
um outro arquivo que foi criado, é o Usuario.java:

import java.io.Serializable;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.NamedQueries;
import javax.persistence.NamedQuery;
import javax.persistence.Table;

/**
 *
 * @author Rodrigo
 */
@Entity
@Table(name = "usuario")
@NamedQueries({@NamedQuery(name = "Usuario.findByUsuario", query = "SELECT u FROM Usuario u WHERE u.usuario = :usuario"), @NamedQuery(name = "Usuario.findByLogin", query = "SELECT u FROM Usuario u WHERE u.login = :login"), @NamedQuery(name = "Usuario.findBySenha", query = "SELECT u FROM Usuario u WHERE u.senha = :senha"), @NamedQuery(name = "Usuario.findByNome", query = "SELECT u FROM Usuario u WHERE u.nome = :nome")})
public class Usuario implements Serializable {
    private static final long serialVersionUID = 1L;
    @Id
    @Column(name = "USUARIO", nullable = false)
    private Integer usuario;
    @Column(name = "LOGIN", nullable = false)
    private String login;
    @Column(name = "SENHA", nullable = false)
    private String senha;
    @Column(name = "NOME", nullable = false)
    private String nome;

    public Usuario() {
    }

    public Usuario(Integer usuario) {
        this.usuario = usuario;
    }

    public Usuario(Integer usuario, String login, String senha, String nome) {
        this.usuario = usuario;
        this.login = login;
        this.senha = senha;
        this.nome = nome;
    }

    public Integer getUsuario() {
        return usuario;
    }

    public void setUsuario(Integer usuario) {
        this.usuario = usuario;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getSenha() {
        return senha;
    }

    public void setSenha(String senha) {
        this.senha = senha;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    @Override
    public int hashCode() {
        int hash = 0;
        hash += (usuario != null ? usuario.hashCode() : 0);
        return hash;
    }

    @Override
    public boolean equals(Object object) {
        // TODO: Warning - this method won't work in the case the id fields are not set
        if (!(object instanceof Usuario)) {
            return false;
        }
        Usuario other = (Usuario) object;
        if ((this.usuario == null && other.usuario != null) || (this.usuario != null && !this.usuario.equals(other.usuario))) {
            return false;
        }
        return true;
    }

    @Override
    public String toString() {
        return "br.com.chart.persistencia.Usuario[usuario=" + usuario + "]";
    }

}

feito isso eu precisei criar um metodo que fizesse a consulta no banco de acordo com os dados que foram inseridos no formulario da web, login e senha.
Metodo valida Login:

public boolean validaLogin() {
       
        Usuario user = new Usuario();
        EntityManagerFactory emf = Persistence.createEntityManagerFactory("TelefonemasWebPU");
        EntityManager em = emf.createEntityManager();
        EntityTransaction tx = em.getTransaction();
       // user.setLogin(this.usuarioBean.getLogin());
        //user.setSenha(this.usuarioBean.getSenha());
        try {
            Query verifica = em.createQuery(" from usuario u where u.login= ?1  and u.senha= ?2");
            verifica.setParameter(1, this.usuarioBean.getLogin());
            verifica.setParameter(2, this.usuarioBean.getSenha());
            verifica.getResultList();
            System.out.print(verifica.getResultList());
        } catch (EntityNotFoundException notFound) {
        } catch (NonUniqueResultException nonUnique) {
        }
        return false;

    }

nesse codigo eu usei uma classe chamada UsuarioBean, porque eu achei que seria mais simples preu soh pegar os valores que vem do meu formulario, no caso login e senha.

Neste momento nao estou muito interessado no que ele vai me retornar, pelo menos por enquanto, meu problema mesmo e é minha EJB QL, não esta sendo reconhecida,
pois dentre os erros que o tomcat me retorna este esta dificil pra mim resolver:

Exception [TOPLINK-8025] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.EJBQLException

Exception Description: Syntax error parsing the query [from usuario u where u.login= ?1  and u.senha= ?2], line 1, column 1: unexpected token [from].

Internal Exception: line 1:1: unexpected token: from

oracle.toplink.essentials.exceptions.EJBQLException.unexpectedToken(EJBQLException.java:389)

oracle.toplink.essentials.internal.parsing.ejbql.EJBQLParser.handleANTLRException(EJBQLParser.java:350)

oracle.toplink.essentials.internal.parsing.ejbql.EJBQLParser.addError(EJBQLParser.java:278)

oracle.toplink.essentials.internal.parsing.ejbql.EJBQLParser.reportError(EJBQLParser.java:378)

oracle.toplink.essentials.internal.parsing.ejbql.antlr273.EJBQLParser.document(EJBQLParser.java:156)

oracle.toplink.essentials.internal.parsing.ejbql.EJBQLParser.parse(EJBQLParser.java:166)

oracle.toplink.essentials.internal.parsing.ejbql.EJBQLParser.buildParseTree(EJBQLParser.java:127)

oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:215)

oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:189)

oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:153)

oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.(EJBQueryImpl.java:114)

oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.(EJBQueryImpl.java:99)

oracle.toplink.essentials.internal.ejb.cmp3.EJBQueryImpl.(EJBQueryImpl.java:86)

oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerImpl.createQuery(EntityManagerImpl.java:204)

br.com.chart.Beans.BuscaUsuario.BuscaUsuario.validaLogin(BuscaUsuario.java:57)

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:152)

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)

Eu coloquei a EJB QL assim direto com o from, sem o select, porque no exemplo do livro que estou lendo, Enterprise Java Beans 3.0 - O’RELLY, o exemplo esta assim, e eu nao consigo ver onde estou errando. Sera que algum poderia me ajudar?

OBS: peço desculpas pelo tamanho do topico, mas ainda sou iniciante e queria ilutrar bem o meu problema.

Valeu Pessoal.

7 Respostas

victor.godinho

Errado:

Certo:

R

Valeu Victou vou tentar aqui

R

Eu ja havia tentado assim antes, mas tentei novamente aqui parece que agora a EJB QL esta correta, mas ele passou a me retornar um erro que estava retonando antes
e tambem nao consegui resolver

Exception [TOPLINK-8034] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.EJBQLException

Exception Description: Error compiling the query [ select u from usuario u where u.login= ?1  and u.senha= ?2]. Unknown abstract schema type [usuario].

oracle.toplink.essentials.exceptions.EJBQLException.unknownAbstractSchemaType(EJBQLException.java:494)

oracle.toplink.essentials.internal.parsing.ParseTreeContext.classForSchemaName(ParseTreeContext.java:163)

oracle.toplink.essentials.internal.parsing.SelectNode.getClassOfFirstVariable(SelectNode.java:366)

oracle.toplink.essentials.internal.parsing.SelectNode.getReferenceClass(SelectNode.java:354)

oracle.toplink.essentials.internal.parsing.ParseTree.getReferenceClass(ParseTree.java:463)

oracle.toplink.essentials.internal.parsing.ParseTree.adjustReferenceClassForQuery(ParseTree.java:103)

oracle.toplink.essentials.internal.parsing.EJBQLParseTree.populateReadQueryInternal(EJBQLParseTree.java:127)

oracle.toplink.essentials.internal.parsing.EJBQLParseTree.populateQuery(EJBQLParseTree.java:108)

oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:219)

oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:189)

oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.buildEJBQLDatabaseQuery(EJBQueryImpl.java:153)

oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.(EJBQueryImpl.java:114)

oracle.toplink.essentials.internal.ejb.cmp3.base.EJBQueryImpl.(EJBQueryImpl.java:99)

oracle.toplink.essentials.internal.ejb.cmp3.EJBQueryImpl.(EJBQueryImpl.java:86)

oracle.toplink.essentials.internal.ejb.cmp3.EntityManagerImpl.createQuery(EntityManagerImpl.java:204)

br.com.chart.Beans.BuscaUsuario.BuscaUsuario.validaLogin(BuscaUsuario.java:54)

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:152)

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)

pois nao sei onde eu falo pro jpa o que e usuario, pensei que fosse a minha classe usuario.java que representava minha tabela mas parece que nao… eu estava seguindo os exemplos do livro mas agarrei nisso…

victor.godinho

Esse erro ai com o “select u from …” é que ele não está encontrando esse seu objeto “usuario”, tem certeza que é isso?

Não é por exemplo “Usuario”, ou “UsuarioTO”, “UsuarioEntity” , … ? Você deve colocar o nome da classe ai na query.

R

Ok, vou tertar usar o u maiusuculo

R

Victor, Valeu pela ajuda cara… vou tentar mais amanha, vou ter que ir embora pq senao o porteiro vai acabar me expulsando do predio o horario de funcionamento daki ja acabou faz tempo.

Valeu mesmo cara!

R

É cara, minha classe chame-se Usuario, mesmo assim deu o mesmo erro, eu devo ter deixado passar batido algum anotation ou mapeamento, pra ele nao estar enxergando meu schema

Criado 16 de setembro de 2008
Ultima resposta 17 de set. de 2008
Respostas 7
Participantes 2