Bom, vou explicar o que está acontecendo. Estou criando um crud simples pra treinar a conexão com o banco de dados utilizando JPA e aprendendo como criptografar a senha para salvar no banco. Estou fazendo esse crud utilizando Servlet para a parte web. O problema se dar quando rodo o servidor e realizo o primeiro cadastro ele funciona normalmente só que quando vou fazer um novo cadastro ele da um erro dizendo que a conexão está fechada, alguém tem como me explicar como resolver isso? Vou deixar todo codigo a abaixo.
CODIGO:
@Entity
@Table(name = "clientes")
public class Cliente {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "Id")
private Long id;
@Column(name = "Nome")
private String nome;
@Column(name = "Email")
private String email;
@Column(name = "Senha")
private String senha;
public Cliente(String nome, String email, String senha) {
super();
this.nome = nome;
this.email = email;
this.senha = senha;
}
public Long getId() {
return id;
}
public String getNome() {
return nome;
}
public String getEmail() {
return email;
}
public String getSenha() {
return senha;
}
}
public class ClienteRepositorio {
public void cadastrar(Cliente cliente) throws SQLException {
EntityManager manager = JPAUtil.getEntityManager();
EntityTransaction transaction = manager.getTransaction();
try {
transaction.begin();
manager.persist(cliente);
transaction.commit();
} catch (Exception e) {
if (transaction.isActive()) {
transaction.rollback();
}
throw new SQLException(e);
} finally {
JPAUtil.closeEntityManager();
}
}
}
public class ClienteServico {
private ClienteRepositorio repository = new ClienteRepositorio();
public void cadatrarCliente(Cliente cliente) throws SQLException {
String nome = cliente.getNome();
String email = cliente.getEmail();
String senha = cliente.getSenha();
String senhaHash = BCrypt.hashpw(senha, BCrypt.gensalt(12));
Cliente clientCadastrado = new Cliente(nome,email,senhaHash);
repository.cadastrar(clientCadastrado);
}
}
public class CadastroClienteBean implements TipoAcao {
@Override
public String execute(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String nome = req.getParameter("nome");
String email = req.getParameter("email");
String senha = req.getParameter("senha");
Cliente cliente = new Cliente(nome, email, senha);
ClienteServico servico = new ClienteServico();
try {
servico.cadatrarCliente(cliente);
} catch (SQLException e) {
e.printStackTrace();
}
return "forward:listar-clientes.jsp";
}
}
public class JPAUtil {
private static final EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("cliente");
public static EntityManager getEntityManager() {
return entityManagerFactory.createEntityManager();
}
public static void closeEntityManager() {
entityManagerFactory.close();
}
}
@WebServlet(urlPatterns = "/cliente")
public class ClienteControlador extends HttpServlet{
private static final long serialVersionUID = 1L;
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String action = req.getParameter("acao");
String fqn = "br.com.cliente.bean." + Character.toUpperCase(action.charAt(0)) + action.substring(1);
String nome;
try {
Class<?> classe = Class.forName(fqn);
@SuppressWarnings("deprecation")
TipoAcao acao = (TipoAcao) classe.newInstance();
nome = acao.execute(req, resp);
} catch (ClassNotFoundException | SecurityException | InstantiationException
| IllegalAccessException | IllegalArgumentException e) {
throw new ServletException(e);
}
String[] tipoEndereco = nome.split(":");
if (tipoEndereco[0].equals("forward")) {
RequestDispatcher dispatcher = req.getRequestDispatcher(tipoEndereco[1]);
dispatcher.forward(req, resp);
} else {
resp.sendRedirect(tipoEndereco[1]);
}
}
}
O ERRO: