entre Desarrolladores

Recibe ayuda de expertos

Registrate y pregunta

Es gratis y fácil

Recibe respuestas

Respuestas, votos y comentarios

Vota y selecciona respuestas

Recibe puntos, vota y da la solución

Pregunta

2votos

la aplicación solo corre en el IDE

recientemente generé un ejecutable .jar de una aplicación, el cual está dando problemas al conectar a la base de datos; El detalle está que al correrla desde el IDE funciona correctamente. Uso netBeans como IDE, jpa para la conexión a la base de datos, y postgreSQL.

Intente abrirla desde la consola con permisos de administrador, pero no funcionó.

Les dejo el archivo de persistencia, la clase que se conecta a la base de datos y el rastro de la excepción.

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.1" 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_1.xsd">
  <persistence-unit name="claseInterfacesPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <class>clases.ArqueoDeCaja</class>
    <class>clases.ArqueoDeCajaDetalle</class>
    <class>clases.Caja</class>
    <class>clases.CambioDePrecio</class>
    <class>clases.Cliente</class>
    <class>clases.ControlDeCajero</class>
    <class>clases.CuentaPorCobrar</class>
    <class>clases.Empleado</class>
    <class>clases.EmpleadoCaja</class>
    <class>clases.Empresa</class>
    <class>clases.Factura</class>
    <class>clases.FacturaDetalle</class>
    <class>clases.FamiliaDeProducto</class>
    <class>clases.FlujoDeCaja</class>
    <class>clases.FlujoDeCajaDetalle</class>
    <class>clases.FormaDeCobro</class>
    <class>clases.Impuesto</class>
    <class>clases.MedioDePago</class>
    <class>clases.MovimientoDeNotaDeCredito</class>
    <class>clases.NivelDeUsuario</class>
    <class>clases.NotaDeCredito</class>
    <class>clases.NotaDeCreditoDetalle</class>
    <class>clases.PrecioDeProducto</class>
    <class>clases.Producto</class>
    <class>clases.Sesion</class>
    <class>clases.TablaImpresora</class>
    <class>clases.TipoDeImpuesto</class>
    <class>clases.TipoDePrecio</class>
    <class>clases.TransaccionDeCaja</class>
    <class>clases.UnidadDeMedida</class>
    <class>clases.UnidadDePeso</class>
  </persistence-unit>
</persistence>
package clasesDao;

import java.io.Serializable;
import java.util.HashMap;
import java.util.Map;
import javax.persistence.*;

public class DatabaseHelper implements Serializable
{
    private static final long serialVersionUID=1L;

    private static EntityManagerFactory emf;
    private static final String unidadDePersistencia="clasesInterfacesPU";     

    private static Map<String,String> propiedades=new HashMap<>();
    private static final String driverJDBC[]={"javax.persistence.jdbc.driver","org.postgresql.Driver"};
    private static final String proveedorDePersistencia[]= {"hibernate.cache.provider_class","org.hibernate.cache.NoCacheProvider"};

    private static String usuario[]={"javax.persistence.jdbc.user","postgres"};
    private static String contrasenha[]={"javax.persistence.jdbc.password","1234"};
    private static String url[]={"javax.persistence.jdbc.url",""};
    private static String servidor=" ";

    //constructores
    public DatabaseHelper()
    {

    }

    public DatabaseHelper(String servidor) 
    {
        setServidor(servidor);     
    }    

    public static void setServidor(String servidor) 
    {
        DatabaseHelper.servidor = servidor;
    }    

    public void initEMF() 
    { 
        initUrl();
        initPropiedades();
        emf=Persistence.createEntityManagerFactory(unidadDePersistencia, propiedades);
    }

    public void cerrar()
    {        
        emf.close();
    }

    public static EntityManager crearEM()
    {        
        return emf.createEntityManager();    
    }

    private void initUrl()
    {
        /*la url de una base de datos PostgreSQL se forma de las siguientes partes
        1.- el driver JDBC
        2.- el nombre del sevidor de base de datos
        3.- el número de puerto en escucha
        4.- el nombre de la base de datos
        Ejemplo: "jdbc:postgresql://localhost:5432/hola" 
        */

        /*1.-driver JDBC*/
        url[1]="jdbc:postgresql://";

        /*2.- el nombre del sevidor de base de datos*/
        url[1]+=servidor;

        /*3.- el número de puerto en escucha*/
        url[1]+=":5432";

        /*4.- el nombre de la base de datos*/
        url[1]+="/hola";

    }

    private void initPropiedades()
    {        
        propiedades.clear();
        propiedades.put(driverJDBC[0], driverJDBC[1]);
        propiedades.put(proveedorDePersistencia[0], proveedorDePersistencia[1]);
        propiedades.put(usuario[0],usuario[1]);
        propiedades.put(contrasenha[0],contrasenha[1]);
        propiedades.put(url[0],url[1]);
        propiedades.put("javax.persistence.schema-generation.database.action", "none");
    }

}

javax.persistence.PersistenceException: No Persistence provider for EntityManager named clasesInterfacesPU
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:85)
at clasesDao.DatabaseHelper.initEMF(DatabaseHelper.java:47)
at gui.principal.Principal.initBaseDeDatos(Principal.java:95)
at gui.principal.Principal.init(Principal.java:42)
at gui.principal.Principal.main(Principal.java:31)

1 Respuesta

2votos

MitsuGami Puntos8010

Tu nombre de unidad de persistencia es claseInterfacesPU, pero obtienes el EntityManagerFactory mediante una unidad de persistencia clasesInterfacesPU, la cual es incorrecta. En teoría, no debería ni correrte ya que te debería lanzar una excepción de Unidad de persistencia no encontrada.

1voto

kevinesaa comentado

Algo raro debe estar pasado; Cuando coloque clasesInterfacesPU en ambas no funcionó. Pero cuando coloque claseInterfacesPU si.

1voto

MitsuGami comentado

No hay nada raro. Tu unidad de persistencia se llama claseInterfacesPU y tu estabas poniendo clasesInterfacesPU, como lo muestra esta línea: private static final String unidadDePersistencia="clasesInterfacesPU".

1voto

kevinesaa comentado

sí, eso lo entiendo. Pero si a ambos le pongo un nombre "A", debe funcionar igual si a ambos le pongo un nombre "B". Pero no, solo funciona si ambos tienen el nombre "claseInterfacesPU".

Por favor, accede o regístrate para responder a esta pregunta.

Otras Preguntas y Respuestas


Actividad Reciente

...

Bienvenido a entre Desarrolladores, donde puedes realizar preguntas y recibir respuestas de otros miembros de la comunidad.

Conecta