8
respostas

Problema no conexão com o banco

Estou criando uma aplicação servlet usando JPA. Não estou utilizando o maven pois tive problemas nas versões e não estava funcionando o servlet resolvi não utilizar. Agora meu problema está na hora de conectar com o banco ele não está criando o banco. Vou deixar o codigo a baixo:

package br.com.cine.model.entities;

import java.time.LocalDate;
import java.util.List;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;

@Entity
@Table(name = "usuarios")
public class Usuario {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "usuario_id")
    private Long id;
    @Column(name = "nome")
    private String nome;
    @Column(name = "sobrenome")
    private String sobrenome;
    @Column(name = "email")
    private String email;
    @Column(name = "senha")
    private String senha;
    @Column(name = "data_nascimento")
    private LocalDate dataDeNascimento;
    @Column(name = "genero")
    private String genero;
    @Column(name = "ativo")
    private Boolean ativo;

    @OneToMany(mappedBy = "usuario", fetch = FetchType.EAGER)
    private List<Avaliacoes> listAvaliacoes;
    
    public Usuario(String nome, String sobrenome, String email, String senha, LocalDate dataDeNascimento,
            String genero) {
        this.nome = nome;
        this.sobrenome = sobrenome;
        this.email = email;
        this.senha = senha;
        this.dataDeNascimento = dataDeNascimento;
        this.genero = genero;
        this.ativo = true;
    }	
    
    public Usuario() {}

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getNome() {
        return nome;
    }

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

    public String getSobrenome() {
        return sobrenome;
    }

    public void setSobrenome(String sobrenome) {
        this.sobrenome = sobrenome;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getSenha() {
        return senha;
    }

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

    public LocalDate getDataDeNascimento() {
        return dataDeNascimento;
    }

    public void setDataDeNascimento(LocalDate dataDeNascimento) {
        this.dataDeNascimento = dataDeNascimento;
    }

    public String getGenero() {
        return genero;
    }

    public void setGenero(String genero) {
        this.genero = genero;
    }

    public Boolean getAtivo() {
        return ativo;
    }

    public void setAtivo(Boolean ativo) {
        this.ativo = ativo;
    }

    public List<Avaliacoes> getListAvaliacoes() {
        return listAvaliacoes;
    }

    public void setListAvaliacoes(List<Avaliacoes> listAvaliacoes) {
        this.listAvaliacoes = listAvaliacoes;
    }

    @Override
    public String toString() {
        return "Usuario [id=" + id + ", nome=" + nome + ", sobrenome=" + sobrenome + ", email=" + email + ", senha="
                + senha + ", dataDeNascimento=" + dataDeNascimento + ", genero=" + genero + ", ativo=" + ativo
                + ", listAvaliacoes=" + listAvaliacoes + "]";
    }

}
8 respostas
public class UsuarioRepository implements IUsuarioRepository {
    
    @Override
    public void cadastrarUsuario(Usuario usuario) throws SQLException {
        EntityManager manager = JPAUtil.getEntityManager();
        EntityTransaction transaction = manager.getTransaction();

        try {
            transaction.begin();
            manager.persist(usuario);
            transaction.commit();
        } catch (Exception e) {
            throw new SQLException(e);
        } finally {
           if(transaction.isActive()) {
                transaction.rollback();
            }

           manager.close();
        }
    }

    @Override
    public Optional<Usuario> buscarUsuarioPorEmailESenha(String email, String senha) throws SQLException {
        EntityManager manager = JPAUtil.getEntityManager();
        EntityTransaction transaction = manager.getTransaction();
    
        Usuario usuario = null;
    
        try {
            transaction.begin();
            usuario = manager.createQuery("from Usuario u where u.email = :email and u.ativo = true", Usuario.class)
                .setParameter("email", email)
                .getSingleResult();
    
            // Verificar se a senha fornecida corresponde à senha criptografada no banco de dados
            if (usuario != null && BCrypt.checkpw(senha, usuario.getSenha())) {
                transaction.commit();
            } else {
                usuario = null;
                throw new IllegalArgumentException("Email ou senha inválidos!");
            }
        } catch (Exception e) {
            throw new SQLException(e);
        } finally {
            if (transaction.isActive()) {
                transaction.rollback();
            }
            manager.close();
        }
    
        return Optional.ofNullable(usuario);
    }

    public Optional<Usuario> buscarUsuarioPorEmail(String email) throws SQLException {
        EntityManager manager = JPAUtil.getEntityManager();
        EntityTransaction transaction = manager.getTransaction();
    
        Usuario usuario = null;
    
        try {
            transaction.begin();
            usuario = manager.createQuery("from Usuario u where u.email = :email and u.ativo = true", Usuario.class)
                .setParameter("email", email)
                .getSingleResult();
    
            transaction.commit();
        } catch (Exception e) {
            throw new SQLException(e);
        } finally {
            if (transaction.isActive()) {
                transaction.rollback();
            }
            manager.close();
        }
    
        return Optional.ofNullable(usuario);
    }
    
    @Override
    public Optional<Usuario> buscarUsuarioPeloID(Long id) throws SQLException{
        EntityManager manager = JPAUtil.getEntityManager();
        EntityTransaction transaction = manager.getTransaction();

        Usuario usuario = null;

        try {
            transaction.begin();
            //buscar o usuario pelo id e verificar se ele está ativo
            usuario = manager.createQuery("from Usuario u where u.id = :id and u.ativo = true", Usuario.class)
                .setParameter("id", id)
                .getSingleResult();
            transaction.commit();
        } catch (Exception e) {
            throw new SQLException(e);
        } finally {
           if(transaction.isActive()) {
                transaction.rollback();
            } 

           manager.close();
        }

        return Optional.ofNullable(usuario);
    }

    @Override
    public void alterarUsuario(Usuario usuario) throws SQLException {
        EntityManager manager = JPAUtil.getEntityManager();
        EntityTransaction transaction = manager.getTransaction();

        try {
            transaction.begin();
            manager.merge(usuario);
            transaction.commit();
        } catch (Exception e) {
            throw new SQLException(e);
        } finally {
           if(transaction.isActive()) {
                transaction.rollback();
            } 
           manager.close();
        }
    }

    @Override
    public void excluirUsuarioPeloId(Long id) throws SQLException {
        EntityManager manager = JPAUtil.getEntityManager();
        EntityTransaction transaction = manager.getTransaction();

        Usuario usuario = null;

        try {
            transaction.begin();
            usuario = manager.find(Usuario.class, id);
            usuario.setAtivo(false);
            manager.merge(usuario);
            transaction.commit();
        } catch (Exception e) {
            throw new SQLException(e);
        } finally {
            if(transaction.isActive()) {
                transaction.rollback();
            }
            
            manager.close();
        }
    }
}
public class UsuarioService {
    private UsuarioRepository usuarioRepository;

    public UsuarioService() {
        this.usuarioRepository = new UsuarioRepository();
    }

    public void cadastrarUsuario(Usuario usuario) throws Exception, SQLException {
        Optional<Usuario> usuarioExistente = buscarUsuarioPorEmail(usuario.getEmail());

        if (usuarioExistente.isPresent()) {
            throw new IllegalArgumentException("Não foi possível cadastrar o usuário com esse email!");
        }

        String senhaHash = EncriptarSenha.encriptarSenha(usuario.getSenha());
        usuario.setSenha(senhaHash);
        ValidarUsuario.validarUsuario(usuario);
        usuarioRepository.cadastrarUsuario(usuario);
    }

    public Optional<Usuario> buscarUsuarioPorEmailESenha(String email, String senha) throws Exception,SQLException {      
        ValidarUsuario.validarEmailESenha(email, senha);
        return usuarioRepository.buscarUsuarioPorEmailESenha(email, senha);
    }

    public Optional<Usuario> buscarUsuarioPorEmail(String email) throws SQLException {
        return usuarioRepository.buscarUsuarioPorEmail(email);
    }

    public Optional<Usuario> buscarUsuarioPorID(Long id) throws SQLException{
        return usuarioRepository.buscarUsuarioPeloID(id);
    }

    public void alterarUsuario(Usuario usuario) throws Exception {
        String senhaHash = EncriptarSenha.encriptarSenha(usuario.getSenha());
        usuario.setSenha(senhaHash);
        ValidarUsuario.validarUsuario(usuario);
        usuarioRepository.alterarUsuario(usuario);
    }

    public void excluirUsuario(Long id) throws SQLException {
        usuarioRepository.excluirUsuarioPeloId(id);
    }
}
public class CadastroUsuarioBean implements TipoAcao {
    
    private HttpServletRequest req;
    private HttpServletResponse resp;
    
    public CadastroUsuarioBean(HttpServletRequest req, HttpServletResponse resp) {
        this.req = req;
        this.resp = resp;
    }

    @Override
    public void execute() throws ServletException, IOException {
        String nome = req.getParameter("name");
        String sobrenome = req.getParameter("lastName");
        String email = req.getParameter("email");
        String senha = req.getParameter("password");
        String dataDeNascimento = req.getParameter("date");
        String genero = req.getParameter("genero");
        
        LocalDate data = LocalDate.parse(dataDeNascimento);
        
        var usuario = new Usuario(nome, sobrenome, email, senha, data, genero);
        
        var usuarioService = new UsuarioService();
        
        try {
            usuarioService.cadastrarUsuario(usuario);
        } catch (Exception e) {
            e.printStackTrace();
        }
        
        this.resp.sendRedirect("cine?action=LoginFormBean");
        
    }
    
    
}
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.2"
    xmlns="http://xmlns.jcp.org/xml/ns/persistence"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence http://xmlns.jcp.org/xml/ns/persistence/persistence_2_2.xsd">
    <persistence-unit name="cine"
        transaction-type="RESOURCE_LOCAL">
        <class>br.com.cine.model.entities.Usuario</class>
        <class>br.com.cine.model.entities.Filmes</class>
        <class>br.com.cine.model.entities.Series</class>
        <class>br.com.cine.model.entities.Avaliacoes</class>
        <properties>
            <property name="javax.persistence.jdbc.driver"
                value="com.mysql.jdbc.Driver" />
            <property name="javax.persistence.jdbc.url"
                value="jdbc:mysql://localhost/cine?createDatabaseIfNotExist=true" />
            <property name="javax.persistence.jdbc.user" value="root" />
            <property name="javax.persistence.jdbc.password"
                value="root" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
            <property name="hibernate.show_sql" value="true" />
            <property name="hibernate.format_sql" value="true" />
            <property name="hibernate.hbm2ddl.auto" value="update" />
        </properties>
    </persistence-unit>
</persistence>

As pastas:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

os Jars:

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Então o problema em questão é que o banco não está sendo criado automáticamente? O hibernate está imprimindo o log relatando problema para criação do DB? Mostra ele aqui pra gente, com os logs a gente vai conseguir entender melhor o comportamento da aplicação.

Não é a primeira vez que a gente se encontra por aqui kkkk Você anda praticando as mesmas coisas que eu, se quiser me chamar no Discord a gente pode trocar mais ideias sobre nossas aplicações, meu username é scariotes_san

nov. 14, 2023 1:58:49 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server version name:   Apache Tomcat/9.0.82
nov. 14, 2023 1:58:49 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server built:          Oct 11 2023 13:15:08 UTC
nov. 14, 2023 1:58:49 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Server version number: 9.0.82.0
nov. 14, 2023 1:58:49 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Name:               Windows 11
nov. 14, 2023 1:58:49 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: OS Version:            10.0
nov. 14, 2023 1:58:49 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Architecture:          amd64
nov. 14, 2023 1:58:49 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Java Home:             C:\Program Files\Java\jdk-20
nov. 14, 2023 1:58:49 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Version:           20+36-2344
nov. 14, 2023 1:58:49 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: JVM Vendor:            Oracle Corporation
nov. 14, 2023 1:58:49 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_BASE:         C:\Users\bruno\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0
nov. 14, 2023 1:58:49 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: CATALINA_HOME:         C:\Users\bruno\Desktop\Arquivos-projeto\apache-tomcat-9.0.82-windows-x64\apache-tomcat-9.0.82
nov. 14, 2023 1:58:49 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.base=C:\Users\bruno\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0
nov. 14, 2023 1:58:49 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dcatalina.home=C:\Users\bruno\Desktop\Arquivos-projeto\apache-tomcat-9.0.82-windows-x64\apache-tomcat-9.0.82
nov. 14, 2023 1:58:49 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dwtp.deploy=C:\Users\bruno\eclipse-workspace\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps
nov. 14, 2023 1:58:49 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: --add-opens=java.base/java.lang=ALL-UNNAMED
nov. 14, 2023 1:58:49 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: --add-opens=java.base/java.io=ALL-UNNAMED
nov. 14, 2023 1:58:49 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: --add-opens=java.base/java.util=ALL-UNNAMED
nov. 14, 2023 1:58:49 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: --add-opens=java.base/java.util.concurrent=ALL-UNNAMED
nov. 14, 2023 1:58:49 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: --add-opens=java.rmi/sun.rmi.transport=ALL-UNNAMED
nov. 14, 2023 1:58:49 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -Dfile.encoding=UTF-8
nov. 14, 2023 1:58:49 PM org.apache.catalina.startup.VersionLoggerListener log
INFO: Command line argument: -XX:+ShowCodeDetailsInExceptionMessages
nov. 14, 2023 1:58:49 PM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFO: Loaded Apache Tomcat Native library [1.2.39] using APR version [1.7.4].
nov. 14, 2023 1:58:49 PM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true], UDS [true].
nov. 14, 2023 1:58:49 PM org.apache.catalina.core.AprLifecycleListener lifecycleEvent
INFO: APR/OpenSSL configuration: useAprConnector [false], useOpenSSL [true]
nov. 14, 2023 1:58:49 PM org.apache.catalina.core.AprLifecycleListener initializeSSL
INFO: OpenSSL successfully initialized [OpenSSL 3.0.11 19 Sep 2023]
nov. 14, 2023 1:58:49 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler ["http-nio-8080"]
nov. 14, 2023 1:58:49 PM org.apache.catalina.startup.Catalina load
INFO: Server initialization in [873] milliseconds
nov. 14, 2023 1:58:49 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service [Catalina]
nov. 14, 2023 1:58:49 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet engine: [Apache Tomcat/9.0.82]
nov. 14, 2023 1:58:51 PM org.apache.jasper.servlet.TldScanner scanJars
INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time.
nov. 14, 2023 1:58:51 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler ["http-nio-8080"]
nov. 14, 2023 1:58:51 PM org.apache.catalina.startup.Catalina start
INFO: Server startup in [1824] milliseconds

Não tem nenhum log do Hibernate. Parece que ele não tá rodando... Talvez ele esteja utilizando lazy initialization... Já tentou enviar uma requisição para a aplicação? Quando alguma interação com o banco de dados for executada, o hibernate deve enfim inicializar, acredito que a partir daí, se tudo correr bem ele vai configurar o banco e as tabelas de acordo com o mapeamento.

O que acontece quando você realiza uma operação que necessidade de interação com o banco de dados?

Estou achando que o problema está no jar do conector q não está funcionando;

Exception in thread "main" java.lang.ExceptionInInitializerError
    at br.com.cine.model.repository.UsuarioRepository.buscarUsuarioPorEmail(UsuarioRepository.java:67)
    at br.com.cine.model.service.UsuarioService.buscarUsuarioPorEmail(UsuarioService.java:35)
    at br.com.cine.model.service.UsuarioService.cadastrarUsuario(UsuarioService.java:17)
    at br.com.cine.controller.Teste.main(Teste.java:23)
Caused by: javax.persistence.PersistenceException: No Persistence provider for EntityManager named cine
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:85)
    at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54)
    at br.com.cine.model.util.JPAUtil.<clinit>(JPAUtil.java:9)
    ... 4 more

O erro indica que não há um provedor de persistência, o que eu entendo disso é que a JPA não está encontrando uma biblioteca que a implemente, no seu caso, quem deveria implementar a JPA é o Hibernate. Pode ser algum problema de compatibilidade de versão da sua JPA com a biblioteca Hibernate

Testa outra versão do hibernate, pelo que vi, a última versão que tem suporte para javax-persistence 2.2 é a 5.4.26 Final, você está usando 5.4.33 Final