web-dev-qa-db-fra.com

persistence.xml avec Glassfish 3.1.1

Je suis très novice dans Glassfish, JPA, etc., et j’ai vraiment de la difficulté à la mettre en place. Ce que je prévois de faire est un simple service RESTful avec un backend persistant. J'utilise glassfish3 en tant que serveur d'applications et j'ai déjà déployé un simple service REST avec la bibliothèque de maillots. Maintenant, je souhaite donner accès à une base de données via JPA. Glassfish est livré avec JavaDB/derby et EclipseLink, n'est-ce pas? Donc, je veux utiliser ça :-)

J'ai créé un fichier persistence.xml dans 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>

Ensuite, j'ai créé un champ dans ma ressource, où je veux accéder/stocker des données som:

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

Mais "emf" est toujours NULL :-(

Je suppose que mon persistence.xml n'est pas configuré de manière appropriée.

Je serais vraiment heureux si quelqu'un a un indice, ce que je fais mal ...

merci!

11
Eddy

J'ai maintenant la solution à mon problème. Voici la configuration correspondante:

  • poisson-verre 3.1.1
  • base de données JavaDB/derby intégrée: jdbc/__ default
  • jPA de glassfish, qui est éclipselink
  • (JAX RS: Jersey, livré avec Glassfish)

Donc, vous devez créer le dossier "META-INF" dans votre dossier src et y placer le fichier persistence.xml:

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

J'ai créé le fichier .xml précédemment dans le fichier META-INF de WebContent, ce qui est faux. Vous n'avez pas non plus besoin de référencer de bibliothèques supplémentaires, car les modules de glassfish ont été ajoutés.

Maintenant, j'ai créé un JavaBean, dans lequel j'injecte le PersistenceUnit:

@Stateless
public class StorageService {

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

...
}

Et celui-ci est injecté dans mes classes de ressources des Servlets de Jersey:

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

    @EJB
    StorageService storageService;

...
}

Les injections ne fonctionnent que si les classes sont marquées "@Stateless".

5
Eddy

Je pense qu'il est préférable de créer JNDI pour la connexion à la base de données. Vous pouvez le faire facilement avec GlassFish.

Commencez par créer un pool de connexions (vous définissez les paramètres de connexion à la base de données);

Ressources-> JDBC-> Pools de connexions JDBC

Après cette caisse, nom JNDI pour ce pool;

Ressources-> JDBC-> Ressources JDBC

Disons que vous définissez le nom JNDI comme "dbCon"

Et voici votre 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>

Remarque: vous devez copier votre fichier jdbc dans\glassfish-3.1.1\glassfish\domain\domain1\lib\ext.

11
Jman

Je n'ai pas essayé avec le service RESTful, mais je suppose que cela ne devrait pas avoir d'importance. J'ai remarqué que vous utilisiez persistence.xml pour la version 1. Une raison spécifique?

Suivre persistence.xml fonctionne pour moi:

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

J'espère que cela t'aides.

0
Atul Acharya