我正在尝试咨询 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>
拜托,登录不起作用,我不知道为什么...