2012-02-04 18 views
11

Sono molto nuovo per glassfish, JPA e così via e ho davvero problemi con l'impostazione. Quello che sto pensando di fare è un semplice servizio RESTful con un backend persistente. Sto usando glassfish3 come application server e ho già implementato un semplice servizio REST con la jersey-library. Ora voglio fornire l'accesso a un database tramite JPA. Glassfish viene fornito con JavaDB/derby ed EclipseLink, giusto? Quindi, voglio usare quella :-)persistence.xml con Glassfish 3.1.1

ho creato un persistence.xml in 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> 

Poi ho creato un campo nella mia risorsa, dove voglio accedere ai dati/store som :

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

Ma "fem" è sempre :-(NULL

Credo che il mio persistence.xml non è configurato appropriato

.

Sarei davvero felice se qualcuno ha un suggerimento, cosa sto facendo male ...

grazie!

risposta

5

Ho la soluzione ora per il mio problema. Ecco la configurazione corrispondente:

  • glassfish 3.1.1
  • database integrato/derby JavaDB: jdbc/__ predefinita
  • JPA di GlassFish, che è EclipseLink
  • (JAX RS: Jersey, che viene fornito con GlassFish)

Quindi, si deve creare la cartella "META-INF" wihtin cartella src e mettere il persistence.xml lì:

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

ho creato il .xml in precedenza nel META-INF di WebContent, e ciò che è sbagliato. Inoltre non devi fare riferimento a nessuna libreria aggiuntiva, dato che hai aggiunto i moduli glassfish.

Ora ho creato un JavaBean, dove faccio iniettare il PersistenceUnit:

@Stateless 
public class StorageService { 

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

... 
} 

e questo è iniettato nelle mie risorse classi della maglia-servlet:

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

    @EJB 
    StorageService storageService; 

... 
} 

le iniezioni funziona solo se le classi sono contrassegnate come "@Stateless".

+0

Non importa dove persistence.xml è nel tuo progetto, importa dove viene distribuito. Dovrebbe risiedere in app.war: /WEB-INF/classes/META-INF/persistence.xml ma stava finendo in app.war: /META-INF/persistence.xml è sospetto. –

11

Penso che sia meglio creare JNDI per la connessione db. Puoi farlo facilmente con GlassFish.

Innanzitutto creare un pool di connessioni (si imposteranno le impostazioni di connessione db);

risorse-> JDBC> Piscine JDBC Connection

Dopo che il nome JNDI cassa per il pool;

risorse-> JDBC> Risorse JDBC

Allora supponiamo di impostare nome JNDI come "dbCon"

E qui il tuo 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: è necessario copiare il vaso JDBC a \ GlassFish-3.1.1 \ GlassFish \ domini \ domain1 \ lib \ ext

+0

Grazie per la vostra risposta rapida. Sto usando il derbypool predefinito di glassfish e ho cambiato la riga in jdbc/__ default ha anche aggiunto il derby.jar a quella cartella. Inoltre ho annotato la mia classe con Stateless e LocalBean, che è necessario, giusto? Ora EntityManer non è più NULL, ma non sono in grado di mantenere alcun dato, ottengo sempre questo errore: javax.servlet.ServletException: java.lang.IllegalStateException: impossibile recuperare EntityManagerFactory per unitName myPU – Eddy

+0

hai provato a eseguire il ping database su pool di connessioni jdbc -> DerbyPool dalla pagina di amministrazione glass glass. Se si verifica lo stesso errore quando si tenta di eseguire il ping e se questo errore esiste "java.lang.ClassNotFound", è possibile copiare il file derby.jar in glassfish-3.1.1 \ glassfish \ lib. – Jman

+0

Il ping funziona con il database. Ho trovato la soluzione ora, la pubblicheremo presto .. il tuo consiglio mi ha spinto nella giusta direzione :) grazie! – Eddy

0

Non ho provato con il servizio RESTful, ma credo che non dovrebbe importa. Ho notato che stai usando persistence.xml per la versione 1. Qualche ragione specifica?

seguito persistence.xml funziona per me:

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

Spero che questo aiuti.

+0

no, non c'è motivo ^^ Voglio usare JPA 2.0, grazie per il suggerimento! – Eddy

Problemi correlati