2010-12-14 91 views
3

Environnement: Windows 7, NetBean 6.9 (celui dont v3 de GlassFish, Java EE 6), serveur MySQLobjet persistance ne peut pas trouver l'unité de persistance de persistence.xml

J'ai créé des tables dans la base de données MySQL et en utilisant la capacité de NetBean par un clic droit sur le projet et choisissez "create entity from database" (Désolé si le libellé est faux parce que mon NetBean est en japonais)

Cela créera des entités.

Maintenant, je suis allé tester si je peux accéder à DB via Entity Manager.

Tmp.java

package local.test.tmp; 
import Resources.Users; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Persistence; 
import javax.persistence.EntityManager; 
import javax.persistence.Query; 

import java.util.List; 
/** 
* 
* @author m-t 
*/ 
public class Tmp { 

    private static EntityManagerFactory factory; 
    private static final String WEB_PU = "WebApplication1PU"; 

    public static void main(String args[]) { 
     factory = Persistence.createEntityManagerFactory(WEB_PU); 
     EntityManager em = factory.createEntityManager(); 
     //read existing entries and write to concole 
     Query q = em.createQuery("select * from users"); 

     List<Users> userList = q.getResultList(); 
     for(Users u : userList) { 
      System.out.println(u); 
     } 
    } 
} 

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"> 
    <!-- orignal 
    <persistence-unit name="WebApplication1PU" transaction-type="JTA"> 
    <jta-data-source>masatoJNDI</jta-data-source> 
    <properties/> 
    </persistence-unit> 
    --> 

    <persistence-unit name="WebApplication1PU" transaction-type="JTA"> 
    <jta-data-source>masatoJNDI</jta-data-source> 
    <properties> 
     <property name="toplink.jdbc.user" value="masato" /> 
     <property name="toplink.jdbc.password" value="foobar" /> 
    </properties> 
    </persistence-unit> 
</persistence> 

Quand je lance Tmp.java, je peux le voir échoue à:

factory = Persistence.createEntityManagerFactory(WEB_PU); 

Erreur msg:

Exception in thread "main" javax.persistence.PersistenceException: No Persistence 
provider for EntityManager named WebApplication1PU 
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:84) 
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:54) 
at local.test.tmp.Tmp.main(Tmp.java:24) 

J'ai vérifié l'orthographe de l'unité de persistance « de WebApplication1PU » dans le code de test correspond à persistence.xml avec et il est correct.

persistence.xml est situé ... il est en japonais, je ne sais pas comment en anglais :(

Permettez-moi ..

project 
|-------web page 
|-------test package 
|-------lib 
|-------enterprise bean 
|-------*** file //blah file, I can't translate.. 
       |-----MNIFEST.MF 
       |-----faces-cofig.xml 
       |-----persistence.xml //HERE!! 

Depuis l'échec est au début où l'usine tente de trouver l'unité de persistance dans persistence.xml, je suis totalement confus. Est-ce que je devrais vérifieront

? S'il vous plaît laissez-moi savoir si vous avez besoin de plus d'éclaircissements.

MISE À JOUR

J'ai essayé des solutions possibles mais pas de chance .. Le même message d'erreur est renvoyé. Oui, le fournisseur par défaut de netbean 6.9 est toplink.

Ce que je l'ai fait:

fournisseur Ajouté à 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="NoJSFPU" transaction-type="JTA"> 
    <provider>oracle.toplink.essentials.PersistenceProvider</provider> 
    <jta-data-source>masatoJNDI</jta-data-source> 

    <properties> 
     <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/mytest"/> 
     <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
     <property name="toplink.jdbc.user" value="masato" /> 
     <property name="toplink.jdbc.password" value="mocha123" /> 
    </properties> 
    </persistence-unit> 
</persistence> 

On dirait que la plupart des gens sont le succès avec ma situation. Je commence maintenant à penser qu'il peut y avoir un problème avec la façon dont je cours le fichier de test ou où le fichier se trouve?

Tmp.java que j'EXÉCUTE de NetBean est situé à:

project 
|------web page 
|------source package 
|   |-----------local.test.session 
      |-----------local.test.tmp 
          |------------------Tmp.java //HERE 

Je ne sais pas si cela importe bien.

MISE À JOUR 2

J'ai ajouté TopLink lib contenant TopLink-essential.jar et TopLink essentiels-agent.jar dans le répertoire lib de mon projet et maintenant je reçois une nouvelle erreur sur le dessus de original mais je crois que je me rapproche.

On dirait que l'attribut de version dans persistence.xml a un problème ... ???

Exception in thread "main" javax.persistence.PersistenceException: No Persistence provider for EntityManager named WebApplication1PU: Provider named oracle.toplink.essentials.PersistenceProvider threw unexpected exception at create EntityManagerFactory: 
oracle.toplink.essentials.exceptions.PersistenceUnitLoadingException 
Local Exception Stack: 
Exception [TOPLINK-30005] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.PersistenceUnitLoadingException 
Exception Description: An exception was thrown while searching for persistence archives with ClassLoader: [email protected] 
Internal Exception: Exception [TOPLINK-30004] (Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.PersistenceUnitLoadingException 
Exception Description: An exception was thrown while processing persistence.xml from URL: file:/C:/Users/m-takayashiki/Documents/NetBeansProjects/NoJSF/build/web/WEB-INF/classes/ 
Internal Exception: 
(1. cvc-complex-type.3.1: Value '2.0' of attribute 'version' of element 'persistence' is not valid with respect to the corresponding attribute use. Attribute 'version' has a fixed value of '1.0'.) 
     at oracle.toplink.essentials.exceptions.PersistenceUnitLoadingException.exceptionSearchingForPersistenceResources(PersistenceUnitLoadingException.java:143) 
     at oracle.toplink.essentials.ejb.cmp3.EntityManagerFactoryProvider.createEntityManagerFactory(EntityManagerFactoryProvider.java:169) 
     at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:110) 
     at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:83) 
     at local.test.tmp.Tmp.main(Tmp.java:24) 

MISE À JOUR 3

Après quelques recherches, trouver le numéro de version doit être 1.0 compatible moi aussi appliqué le correctif et a obtenu une nouvelle erreur.

<?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="NoJSFPU" transaction-type="JTA"> 
    <provider>oracle.toplink.essentials.PersistenceProvider</provider> 
    <jta-data-source>masatoJNDI</jta-data-source> 
    <class>local.test.session.Addresses</class> 
    <class>local.test.session.Users</class> 
    <properties> 
     <property name="toplink.jdbc.url" value="jdbc:mysql://localhost:3306/mytest"/> 
     <property name="toplink.jdbc.driver" value="com.mysql.jdbc.Driver"/> 
     <property name="toplink.jdbc.user" value="masato" /> 
     <property name="toplink.jdbc.password" value="mocha123" /> 
    </properties> 
    </persistence-unit> 
</persistence> 

C'est bizarre parce que je classe déjà fait dans persistence.xml ci-dessus :(

Exception in thread "main" javax.persistence.PersistenceException: Exception [TOPLINK-7060] 
(Oracle TopLink Essentials - 2.0.1 (Build b09d-fcs (12/06/2007))): oracle.toplink.essentials.exceptions.ValidationException 
Exception Description: Cannot acquire data source [masatoJNDI]. 
Internal Exception: javax.naming.NoInitialContextException: Need to specify class name in 
environment or system property, or as an applet parameter, or in an application resource 
file: java.naming.factory.initial 

MISE À JOUR 4

Je ne pense pas que ce qu'on appelle "résolu", mais après une longue essayez, j'ai décidé de simplement exécuter mon code de test dans l'application web au lieu de l'exécuter individuellement depuis netbean.J'ai dû créer web.xml moi-même puisque GlassFish ne le fournit pas. (Je vois sun-web.xml mais ce n'était pas le substitution) Puis créé servlet, définir ma pping dans le fichier web.xml et ajouté mon extrait de code de test au servlet et essayé sur le navigateur. Cela a fonctionné, a réussi à obtenir des données de la base de données.

Je me demande quelle est la raison pour laquelle il ne fonctionnait pas lorsque je tente courir juste le Tmp.java (mon fichier de test) de Netbean ...

+1

où sont situés vos fichiers? le persistence.xml devrait être dans le méta-inf – Steven

+0

duplicate possible de classpath: http://stackoverflow.com/questions/1158159/no-persistence-provider-for-entitymanager-named – javamonkey79

Répondre

2

Je pense que vous devrez peut-être préciser votre fournisseur de persistance. Voir here.

Par exemple:

<provider>org.hibernate.ejb.HibernatePersistence</provider> 

ou

<provider>oracle.toplink.essentials.PersistenceProvider</provider> 

Votre « original » unité de persistance repose sur le serveur pour fil dans les détails comme le fournisseur, mais lorsque vous l'exécutez en dehors du contexte du serveur vous devez spécifier quelques choses - l'un d'entre eux étant le fournisseur.

Voir here.

+1

@ masato-san vous aurez probablement aussi besoin d'ajouter les fichiers jar pour le gestionnaire de persistance à votre classpath. Glassfish est livré avec toplink si je me souviens bien. C'est uniquement parce que vous l'exécutez en dehors du serveur d'applications. Si vous par le biais d'une application ainsi que de faire la même ting que la classe que vous avez donné et déploiement à l'échelle, je parie que cela fonctionnerait. –

+0

@Jschoen: savez-vous ce que le nom du pot serait pour le gestionnaire de persistance? J'ai regardé le répertoire du serveur GlasshFish 3 dans le répertoire lib de mon projet et il a javax.persistence.jar mais je ne pense pas que ce soit ce dont vous parlez. Je pense que –

+1

@ de Masato-san il est juste toplink.jar, mais vous pourriez avoir besoin d'autres. Il y a une liste d'entre eux ici http://download.oracle.com/docs/cd/B32110_01/web.1013/b28217/install.htm#CHDDABJI. Vous pouvez également les télécharger à partir de là. –

5

S'il vous plaît indiquer le <provider> pour votre <persistence-unit>:

<!-- EclipseLink --> 
<provider> 
    org.eclipse.persistence.jpa.PersistenceProvider 
</provider> 

<!-- Hibernate --> 
<provider> 
    org.hibernate.ejb.HibernatePersistence 
</provider> 

<!-- Toplink --> 
<provider> 
oracle.toplink.essentials.PersistenceProvider 
</provider> 

Et ton nom persistence-unit est correct et le chemin de fichier est également dans le chemin de contexte.

+0

Merci pour le pourboire! –

0

Je suppose que le problème est cette ligne:

<jta-data-source>masatoJNDI</jta-data-source> 

qui, à moins que vous utilisez dans un contexte permis JNDI provoquera le type d'erreur que vous avez vu au départ. Essayez de créer un fichier persistence.xml dans votre dossier test/resources et supprimez cette ligne dans la version de test du fichier xml.

0

Je pense que vous devrez peut-être ajouter un contexte JNDI, vous devez créer un fichier jndi.properties dans votre bocal et ajouter le contenu ci-dessous en elle.