2012-02-04 20 views
11

Soy muy nuevo en glassfish, JPA y así sucesivamente y realmente tengo problemas para configurarlo. Lo que planeo hacer es un servicio RESTful simple con un back-end persistente. Estoy usando glassfish3 como servidor de aplicaciones y ya implementé un servicio REST simple con la jersey-library. Ahora quiero proporcionar acceso a una base de datos a través de JPA. Glassfish se envía con JavaDB/derby y EclipseLink, ¿verdad? Por lo tanto, quiero usar eso :-)persistence.xml con Glassfish 3.1.1

creé una persistence.xml en 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> 

Luego, creamos un campo en mi recurso, donde quiero acceder a los datos/almacenamiento som :

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

Pero "fem" es siempre :-(NULL

supongo que mi persistence.xml no está configurado apropiada

.

Estaría muy contento si alguien tiene una pista, lo que estoy haciendo mal ...

gracias!

Respuesta

5

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

  • glassfish 3.1.1
  • base de datos integrada/derby JavaDB: jdbc/__ predeterminado
  • APP de GlassFish, que es EclipseLink
  • (JAX RS: Jersey, que se incluye con glassfish)

Por lo tanto, hay que crear la carpeta "META-INF" wihtin su carpeta src y poner el persistence.xml allí:

<?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> 

creé el .xml previamente en el META-INF de WebContent, y lo que es malo. Tampoco tiene que hacer referencia a ninguna biblioteca adicional, ya que tiene agregados los módulos de Glassfish.

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

@Stateless 
public class StorageService { 

    @PersistenceContext(unitName = "myPU") 
    EntityManager em; 

... 
} 

y éste es inyectado en mis recursos-clases de la Jersey-servlets:

@Path("/someres") 
@Produces(MediaType.APPLICATION_XML) 
@Stateless 
public class SomeRes { 

    @EJB 
    StorageService storageService; 

... 
} 

las inyecciones solo funcionan si las clases están marcadas como "@Stateless".

+0

No importa dónde esté persistence.xml en su proyecto, importa dónde se implemente. Debería residir en app.war: /WEB-INF/classes/META-INF/persistence.xml pero estaba terminando en app.war: /META-INF/persistence.xml es sospechoso. –

11

Creo que es mejor crear JNDI para la conexión db. Puedes hacerlo fácilmente con GlassFish.

Primero cree el grupo de conexiones (configurará las configuraciones de conexión db);

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

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

Recursos-> JDBC-> Recursos JDBC

lo que permite decir que establezca 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: Debe copiar su frasco de JDBC a \ glassfish-3.1.1 \ glassfish \ domains \ domain1 \ lib \ ext

+0

Gracias por su rápida respuesta. Estoy utilizando el derbypool predeterminado de glassfish y cambié la línea a jdbc/__ default También agregué el derby.jar a esa carpeta. Además anoté mi clase con Stateless y LocalBean, eso es necesario, ¿no? Ahora el EntityManer ya no es NULL, pero no puedo conservar ningún dato, siempre aparece este error: javax.servlet.ServletException: java.lang.IllegalStateException: no se puede recuperar EntityManagerFactory para unitName myPU – Eddy

+0

¿ha intentado hacer ping? base de datos en pools de conexiones jdbc -> DerbyPool en la página de administración de glassfish. Si obtiene el mismo error cuando intenta hacer ping y si este error existe "java.lang.ClassNotFound", puede copiar su derby.jar a glassfish-3.1.1 \ glassfish \ lib. – Jman

+0

Ping funciona con la base de datos. Encontré la solución ahora, la publicaré pronto ... tus consejos me llevaron a la dirección correcta :) ¡gracias! – Eddy

0

No he probado con un servicio REST, pero supongo que no debe importar. Me di cuenta de que estás usando persistence.xml para la versión 1. ¿Alguna razón específica?

Siguiendo persistence.xml funciona para mí:

<?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.

+0

no, no hay ninguna razón ^^ Quiero utilizar JPA 2.0, ¡gracias por la pista! – Eddy

Cuestiones relacionadas