0

我正在尝试咨询 MySQL DB 中的登录信息,但我遇到了一个小问题。

我有这堂课:

UtilJPA

private static EntityManagerFactory factory;

static
{
    UtilJPA.factory = Persistence.createEntityManagerFactory("projetoFinal");
}

public static EntityManagerFactory getFactory()
{
    return UtilJPA.factory;
}


private static ThreadLocal<EntityManager> CACHE = new ThreadLocal<EntityManager>();

public static void limparCacheEntityManager()
{
    // tenta ler o EntityManager da Thread atual
    EntityManager em = CACHE.get();

    // fecha o EntityManager caso exista
    if (em != null)
        em.close();

    CACHE.remove();
}

public static EntityManager getEntityManager()
{
    // tenta ler o EntityManager da Thread atual
    EntityManager retorno = CACHE.get();

    // se tem um objeto e este objeto estiver fechado, deve descartá-lo e
    // criar outro
    if ((retorno != null) && (!retorno.isOpen()))
        retorno = null;

    // caso ainda não tenha sido criado, cria um novo e guarda reutilização
    if (retorno == null)
    {
        retorno = UtilJPA.factory.createEntityManager();
        // guarda o objeto para usar sempre o mesmo nesta Thread
        CACHE.set(retorno);
    }

    return retorno;
}

和这堂课

JP道

public abstract class JpaDAO<T> implements UtilDAO<T>
{


protected Class<T> persistentClass;
private EntityManager manager;


/**
 * Método construtor
 */
@SuppressWarnings("unchecked")
public JpaDAO()
{
    super();

    // pegar a classe persistente por reflexão
    Type tipo = ((ParameterizedType) getClass().getGenericSuperclass()).getActualTypeArguments()[0];
    this.persistentClass = (Class<T>) tipo;

    // pega o EntityManager padrão da ThreadAtual
    this.manager = UtilJPA.getEntityManager();
}

public JpaDAO(EntityManager manager)
{
    this();
    this.manager = manager;
}

@Override
public EntityManager getEntityManager()
{
    // caso o EntityManager tenha sido fechado, deve criar um novo
    if ((this.manager != null) && (!this.manager.isOpen()))
        this.manager = UtilJPA.getEntityManager();

    return this.manager;
}

@Override
public T lerPorId(Object id)
{
    return (T) this.getEntityManager().find(this.persistentClass, id);
}

@Override
public List<T> lerTodos()
{
    CriteriaBuilder cb = this.getEntityManager().getCriteriaBuilder();
    CriteriaQuery<T> c = cb.createQuery(this.persistentClass);
    c.select(c.from(this.persistentClass));

    List<T> resultado = this.getEntityManager().createQuery(c).getResultList();
    return resultado;
}

@Override
public T salvar(T objeto)
{
    boolean transacaoAtiva = this.getEntityManager().getTransaction().isActive();

    if (!transacaoAtiva)
        this.abrirTransacao();

    this.getEntityManager().merge(objeto);

    if (!transacaoAtiva)
        this.gravarTransacao();

    return objeto;
}

@Override
public T incluir(T objeto)
{
    boolean transacaoAtiva = this.getEntityManager().getTransaction().isActive();

    if (!transacaoAtiva)
        this.abrirTransacao();

    this.getEntityManager().persist(objeto);

    if (!transacaoAtiva)
        this.gravarTransacao();

    return objeto;
}

public void refresh(T objeto)
{
    boolean transacaoAtiva = this.getEntityManager().getTransaction().isActive();

    if (!transacaoAtiva)
        this.abrirTransacao();

    this.getEntityManager().refresh(objeto);

    if (!transacaoAtiva)
        this.gravarTransacao();
}

@Override
public void excluir(T objeto)
{
    boolean transacaoAtiva = this.getEntityManager().getTransaction().isActive();

    if (!transacaoAtiva)
        this.abrirTransacao();

    this.getEntityManager().remove(objeto);

    if (!transacaoAtiva)
        this.gravarTransacao();
}

@Override
public void abrirTransacao()
{
    this.getEntityManager().getTransaction().begin();
}

@Override
public void gravarTransacao()
{
    this.getEntityManager().flush();
    this.getEntityManager().getTransaction().commit();
}

@Override
public void desfazerTransacao()
{
    this.getEntityManager().getTransaction().rollback();
}

这是我的 UsuarioDAO:

public class UsuarioDAO extends JpaDAO<Usuario> {

public UsuarioDAO()
{
    super();
}

public UsuarioDAO(EntityManager manager)
{
    super(manager);
}

/**
 * 
 */
public Usuario lerPorLogin(String login)
{
    Usuario resultado;

    Query consulta = this.getEntityManager().createQuery("FROM Usuario u WHERE u.login = :login");
    consulta.setParameter("login", login);

    try
    {
        resultado = (Usuario) consulta.getSingleResult();
    }
    catch (NoResultException e)
    {
        resultado = null;
    }

    return resultado;
}   

/**
 * 
 */
public Aluno obterAluno(Usuario usuario)
{
    Aluno retorno = null;

    try {
        retorno = super.getEntityManager().find(Aluno.class, usuario.getId_usuario());
    } catch (Exception e) {
        e.printStackTrace();
    }

    return retorno;
}

/**
 * 
 */
public Professor obterProfessor(Usuario usuario)
{
    Professor retorno = null;

    try {
        retorno = super.getEntityManager().find(Professor.class, usuario.getId_usuario());
    } catch (Exception e) {
        e.printStackTrace();
    }

    return retorno;
}

/**
 * 
 */

}

在我的 Bean 中,我将此方法称为:

public String acaoAutenticar() {
    UsuarioDAO dao = new UsuarioDAO();

    Usuario usuarioDoBanco = dao.lerPorLogin(this.getUsuario().getLogin());

    if (usuarioDoBanco == null) {
        UtilJSF.retornarMensagemErro("Usuário não existe.", null, null);
        return "login?faces-redirect=true";
    } else if (usuarioDoBanco.senhaCorreta(this.getSenha())) {
        // guardar o obteto usuário
        this.setUsuario(usuarioDoBanco);
        this.autenticado = true;

        return "home?faces-redirect=true";
    } else {
        UtilJSF.retornarMensagemErro("Senha inválida.", null, null);
        return "login?faces-redirect=true";
    }
}

当我转到 LerPorLogin() 时,他开始查询,但我无法从数据库中返回任何内容。这是我的 Hibernate.xml:

<?xml version="1.0" encoding="UTF-8"?>
<persistence 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"
version="1.0">

<persistence-unit name="projetoFinal" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <properties>
        <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5InnoDBDialect" />
        <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
        <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/projetoFinal" />
        <property name="javax.persistence.jdbc.user" value="root" />
        <property name="javax.persistence.jdbc.password" value="123456" />

        <property name="hibernate.hbm2ddl.auto" value="update" />
    </properties>
</persistence-unit>

拜托,登录不起作用,我不知道为什么...

4

0 回答 0