web-dev-qa-db-fra.com

JPA persistence.xml META-INF ne fonctionne pas correctement

Je suis perplexe quant à l'emplacement de mon fichier persistence.xml. J'utilise eclipselink 2.4 comme implémentation de JPA 2.0 et mon persistence.xml est situé sous src/main/resources/META-INF/persistence.xml dans le même état.

Premier problème: Après la publication sur mon serveur dans Eclipse, un message d'erreur indiquant que mon persistence.xml est introuvable.

Exception: : Java.lang.IllegalArgumentException: No persistence unit named 'X'
is available in scope Webapp. Available persistence units: [] at

enter image description here

Voici le code pour mon 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="X" transaction-type="JTA">
<provider>org.Eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>localJTA</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
    <property name="eclipselink.target-server" value="WebLogic"/>
    <property name="eclipselink.logging.level" value="FINEST"/>          
</properties>
</persistence-unit>
</persistence>

Si je déplace le META-INF vers webapp/WEB-INF/classes/META-INF, alors cela fonctionne! Je ne peux pas comprendre quel est le problème.

enter image description here

J'ai vérifié le chemin de construction des projets et tout y est bien.

enter image description here

Le deuxième problème que je connais est que ma classe d'entités annotée n'est pas automatiquement capturée par eclipselink. Dans ma configuration JPA, les classes annotées de découverte sont automatiquement sélectionnées. 

enter image description here

J'ai aussi les éléments suivants dans mon xml

<exclude-unlisted-classes>false</exclude-unlisted-classes>

Technologies utilisées: serveur weblogic 12c, EJB 3.1, JPA 2.0, M2E-WTP et JSF 2.1

Mise à jour 1: Laissant META-INF sur le chemin src/main/resources/META-INF/persistence.xml et effectuant une installation maven pour générer le fichier war, le dossier META-INF est correctement placé dans WEB-INF/classes/META-INF/persistence.xml comme il se doit (à l’intérieur de la guerre). Il semble que ce soit uniquement le cas de la création et du fonctionnement local de l'application Web dans Eclipse. Quelqu'un peut-il expliquer cela?

Mise à jour 2: Laisser META-INF dans src/main/resources C'est-à-dire src/main/resources/META-INF/persistence.xml .__ et les suivants dans mon persistence.xml plutôt que de lister explicitement le classe d'entité

<exclude-unlisted-classes>false</exclude-unlisted-classes>

fonctionne si je construis la guerre et le déploie via la console weblogic via Internet Explorer. Pourquoi ça ne marche pas dans Eclipse!?

Mise à jour 3:
avez-vous inspecté ce qui est construit -Oui, dans Eclipse, j'ai construit le jeu automatiquement. En regardant dans le dossier du projet, je vois le package Java, le dossier META-INF contenant le fichier persistence.xml et le dossier de ressources qui se trouvent sous Webapp/target/classes .
Si la guerre est la même -Vous faites référence au dossier Webapp.war qui se trouve dans C:\workspace.metadata.plugins\org.Eclipse.wst.server.core\tmp0\Weblogic12cDomain_auto_generated_ear_generated_ear_\Webapp. guerre ? Si tel est le cas, il ne reste que WEB-INF\lib\jsf-impl-2.1.7.jar
Ensuite, avez-vous inspecté le chemin d'accès aux classes utilisé pour tester votre application dans Eclipse - Cette entrée se trouve dans mon chemin d'accès aux classes, comme prévu sous Webapp/.classpath
si le fichier persistence.xml du répertoire de ressources se trouve d’abord sur le chemin de classe, il sera récupéré au lieu de celui de votre guerre ou de celui du répertoire approprié - Je crois comprendre que Eclipse construira le projet, puis copiez le contenu sur le serveur sans générer de fichier war. 

Voici ce qui est à la racine de Webapp.war généré par maven:

enter image description here

Voici ce qui se trouve à la racine du dossier du projet Webapp:

enter image description here

Voici ce qui se trouve à la racine du dossier Webapp.war sous C:\workspace.metadata.plugins\org.Eclipse.wst.server.core\tmp0\Weblogic12cDomain_auto_generated_ear_\Webapp.war

enter image description here

Si le fichier persistence.xml du répertoire de ressources se trouve d’abord sur le chemin de classe, il sera récupéré au lieu de celui de votre guerre ou de celui du répertoire approprié. - Je ne sais pas ce que vous entendez par là. Le fichier persistence.xml de ma ressource/META-INF est celui que je veux récupérer. Vous ne savez pas ce qu’un fichier de guerre a à voir avec cela? De toute façon, ils devraient être les mêmes persistence.xml, je pense.

Toute aide est très appréciée!! 

14
Padawan

Je crois que vous avez au moins 2 problèmes ici.

1) construire Maven

Votre projet a une structure maven et non une structure de projet Web Eclipse. Il doit donc être construit à l'aide de commandes maven, et non pas une construction Eclipse par défaut. (Je ne suis pas un expert maven, alors s'il vous plaît, les experts maven interviennent et commentent, si ce n'est pas vrai). Ainsi, lorsque vous effectuez une construction automatique dans Eclipse, il ne sait pas que vous devez copier votre fichier src/main/resources/META-INF/persistence.xml dans WEB-INF/classes/META-INF/persistence.xml Des classes.

2) déploiement

Si vous suivez la structure du projet Eclipse, alors Eclipse sait comment empaqueter et ajouter votre projet sur le serveur lorsque vous sélectionnez "Ajouter au serveur". Si vous utilisez maven, votre guerre construite est généralement dans le répertoire cible. Encore une fois, vous devrez soit exporter cette guerre et l’installer à l’aide des outils WebLogic, soit l’installer via la tâche maven.

Vérifiez WebLogic Server avec Maven et Eclipse comment Oracle suggère d’utiliser Eclipse avec WebLogic et Maven

5
Gas

La section 8.2.1 de la spécification JPA indique "Le fichier persistence.xml se trouve dans le répertoire META-INF de la racine de l'unité de persistance." et plus tard "Les classes de persistance gérées peuvent être soit contenues dans la racine de l'unité de persistance; soit peuvent être spécifiées par référence, c'est-à-dire en nommant les classes, les archives de classes ou les fichiers de mappage XML tourner les classes de référence) qui sont accessibles sur le classpath de l'application "

La racine de l'unité de persistance se trouve donc à l'emplacement du répertoire du répertoire META-INF. En plaçant les classes dans un répertoire de classes, elles ne se trouvent pas à la racine de l'unité de persistance et doivent donc être explicitement nommées pour être incluses. 

5
Chris

Vous ne parlez jamais de maven, donc je ne sais pas si cela est dans votre assiette; cela ne fonctionnait pas pour moi avec maven jusqu'à ce que j'ajoute la dépendance hibernate-entitymanager. Mon pom.xml n'avait que le noyau hiberné. Après avoir ajouté hibernate-entitymanager, il a commencé à fonctionner (pour mon test).

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-core</artifactId>
    <version>4.3.1.Final</version>
</dependency>

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-entitymanager</artifactId>
    <version>4.3.1.Final</version>
</dependency>
2
lumpynose

Vérifiez si le fichier persistence.xml est à l’intérieur de votre guerre. Ou ce n’est pas ou c’est mais au mauvais endroit . Vous pouvez également placer ce fichier dans le dossier Java/main/resources afin qu’il soit placé dans votre chemin

0
bhermont