Soy muy nuevo en glassfish, JPA y así sucesivamente y tengo muchas problemas con la configuración que. Lo que estoy planeando hacer es un simple servicio RESTful con un persistente backend. Estoy usando glassfish3 como servidor de aplicaciones y que ya han implementado un simple servicio REST con jersey-biblioteca. Ahora quiero proporcionar acceso a una base de datos a través de JPA. Glassfish es enviado con JavaDB/derby y EclipseLink, ¿es eso cierto? Así que, quiero usar 🙂

He creado un persistence.xml en el META-INF:

<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
    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">
  <persistence-unit name="myPU" transaction-type="JTA">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
    <properties>
      <property name="javax.persistence.jdbc.driver"   value="org.apache.derby.jdbc.ClientDataSource" /> <!-- org.apache.derby.jdbc.EmbeddedDriver -->
      <property name="javax.persistence.jdbc.url"      value="jdbc:derby://localhost:1527/sample;create=true" />
      <property name="javax.persistence.jdbc.user"     value="APP" />
      <property name="javax.persistence.jdbc.password" value="APP" />
      <property name="eclipselink.ddl-generation"      value="create-tables" />
    </properties>
  </persistence-unit>
</persistence>

A continuación, he creado un campo en mi recurso, cuando quiero acceder/tienda som datos:

@PersistenceUnit(unitName = "myPU")
EntityManagerFactory emf;

Pero «emf» siempre es NULL 🙁

Supongo que mi persistence.xml no está configurado apropiado.

Estaría muy contento si alguien tiene una sugerencia, ¿qué estoy haciendo mal…

gracias!

OriginalEl autor Eddy | 2012-02-04

3 Comentarios

  1. 11

    Creo que es mejor crear JNDI para la conexión db . Usted puede hacer fácil con GlassFish.

    En primer lugar crear la conexión de la piscina (db establecido la configuración de la conexión);

    Recursos->JDBC->Conexión de JDBC Piscinas

    Después de que el cajón de nombre JNDI para este grupo ;

    Recursos->JDBC->Recursos JDBC

    Así que digamos que establecer el nombre JNDI como «dbCon»

    Y aquí su persistence.xml ;

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.0" 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_2_0.xsd">
      <persistence-unit name="myPU" transaction-type="JTA">
        <jta-data-source>dbCon</jta-data-source>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties/>
      </persistence-unit>
    </persistence>

    Nota : Usted debe copiar su jdbc frasco \glassfish-3.1.1\glassfish\domains\domain1\lib\ext

    Gracias por tu rápida respuesta. Estoy utilizando el valor predeterminado derbypool de glassfish y cambiar la línea a <jta-data-source>jdbc/__predeterminada</jta-data-source> también se agrega la derby.jar a esa carpeta. Además he anotado en mi clase con los Apátridas y LocalBean, que es necesario, ¿verdad? Ahora el EntityManer no es NULO ya, pero yo no soy capaz de conservar los datos, siempre aparece este error: javax.servlet.ServletException: java.lang.IllegalStateException: no se puede recuperar EntityManagerFactory para unitName myPU
    ¿has probado a hacer ping a la base de datos en la conexión de jdbc piscinas -> DerbyPool desde la página de administración de glassfish . Si usted consigue el mismo error cuando se intenta hacer ping y si este error no existen «de java.lang.ClassNotFound» , usted puede copiar su derby.jar para glassfish-3.1.1\glassfish\lib .
    Ping no funciona con la base de datos. He encontrado la solución ahora, publicaremos pronto.. tus consejos me empujó en la dirección correcta 🙂 gracias!
    Hey, una pregunta más: parece que ustedes son muy buenos en glassfish 🙂 mis datos siempre se pierde, después de que me vuelva a compilar el código.. parece que la base de datos no es persistente.. =/ es que hay algo que falta en mi configuración?
    se establece persistence.xml propiedades como la gota-y-crear-tablas . Esto quitará todas las tablas y recrear el momento de compilar el código . Si usted no quiere que usted puede cambiar como «crear» o «ninguno» .

    OriginalEl autor Jman

  2. 5

    Tengo la solución para mi problema.
    Aquí está la configuración correspondiente:

    • glassfish 3.1.1
    • integrado en JavaDB/derby de la base de datos: jdbc/__predeterminado
    • glassfish del JPA, que es eclipselink
    • (JAX RS: Jersey, que se incluye con glassfish)

    Así, usted tiene que crear la carpeta «META-INF» con su carpeta src y poner el persistence.xml no:

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="1.0"
        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">
      <persistence-unit name="myPU" transaction-type="JTA">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <jta-data-source>jdbc/__default</jta-data-source>
        <exclude-unlisted-classes>false</exclude-unlisted-classes>
        <properties>
            <property name="eclipselink.ddl-generation" value="drop-and-create-tables" />
        </properties>
      </persistence-unit>
    </persistence>

    Que he creado .xml previamente en el META-INF de contenidos web, y eso está mal.
    Usted también no tiene que hacer referencia a cualquiera de bibliotecas adicionales, ya que tienes el servidor glassfish módulos añadidos.

    Ahora he creado un JavaBean, donde hago inyectar el PersistenceUnit:

    @Stateless
    public class StorageService {
    
        @PersistenceContext(unitName = "myPU")
        EntityManager em;
    
    ...
    }

    Y este se inyecta en mi Recurso-Clases de Jersey-Servlets:

    @Path("/someres")
    @Produces(MediaType.APPLICATION_XML)
    @Stateless
    public class SomeRes {
    
        @EJB
        StorageService storageService;
    
    ...
    }

    Las inyecciones sólo funcionan si las clases están marcados como «@Stateless».

    No importa donde persistence.xml es en su proyecto, no importa donde se ha implementado. Debe residir en app.war:/WEB-INF/classes/META-INF/persistence.xml pero fue acabar en la app.war:/META-INF/persistence.xml es sospechoso.

    OriginalEl autor Eddy

  3. 0

    No he probado con servicio RESTful, pero supongo que no importa. Me di cuenta de que usted está usando persistence.xml para la versión 1. Ninguna razón específica?

    Siguientes persistence.xml me funciona:

    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="2.0" 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_2_0.xsd">
        <persistence-unit name="myPU">
            <properties>
                <property name="eclipselink.ddl-generation" value="create-tables" />
                <property name="eclipselink.ddl-generation.output-mode"
                    value="database" />
            </properties>
        </persistence-unit>
    </persistence>

    Espero que esto ayude.

    no, no hay ninguna razón ^^ quiero usar JPA 2.0, gracias por la sugerencia!

    OriginalEl autor Atul Acharya

Dejar respuesta

Please enter your comment!
Please enter your name here