2009-12-12 23 views
3

Une requête connexe j'ai demandé: How to configure & package a simple Java app to use JPAClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver en essayant d'utiliser JPA avec Derby

J'ai une simple base de données Derby que je peux me connecter à via EJBs hébergé dans WebLogic. Maintenant, je voudrais me connecter à partir d'une application Java en ligne de commande en utilisant JPA. Jusqu'à présent, le code Java + le fichier persistence.xml renvoie l'erreur ci-dessous. Qu'est-ce que je fais mal?

Ma mise en page du répertoire:

C:. 
│ Registrar.class 
│ Registrar.java 
│ TxnClient.class 
│ TxnClient.java 
│ 
└───META-INF 
     persistence.xml 

client autonome:

import javax.persistence.*; 

public class TxnClient { 
    public static void main(String[] args) throws Exception { 
     EntityManagerFactory factory = Persistence.createEntityManagerFactory("SRS-EM"); 
     EntityManager manager = factory.createEntityManager(); 
     try { 

     } finally { 
     manager.close(); 
     factory.close(); 
     } 
    } 
} 

persistence.xml

<?xml version="1.0" encoding="windows-1252" ?> 
    <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" xmlns="http://java.sun.com/xml/ns/persistence" version="1.0"> 
    <persistence-unit name="SRS-EM" transaction-type="JTA"> 
     <class>Registrar</class> 
     <properties> 
      <property name="openjpa.ConnectionDriverName" 
          value="org.apache.derby.jdbc.EmbeddedDriver" /> 
      <property name="openjpa.ConnectionURL" 
          value="jdbc:derby:C:\derby-db-files\MyDB" /> 
     </properties> 
    </persistence-unit> 
    </persistence> 

C: \ temp \ JPA> java TxnClient

80 SRS-EM INFO [main] openjpa.Runtime - Starting BEA Kodo 4.2.0load03 
221 SRS-EM INFO [main] openjpa.jdbc.JDBC - Using dictionary class "org.apache.openjpa.jdbc.sql.DerbyDictionary". 
    Exception in thread "main" <openjpa-1.1.0-r422266:657916 nonfatal general error> 
    org.apache.openjpa.persistence.PersistenceException: There were errors initializing your configuration: <openjpa-1.1.0-r422266:657916 fatal store error> org.apache.openjpa.util.StoreException: org.apache.derby.jdbc.EmbeddedDriver 
      at org.apache.openjpa.jdbc.schema.DataSourceFactory.newDataSource(DataSourceFactory.java:123) 
      at org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.createConnectionFactory(JDBCConfigurationImpl.java:776) 
      at org.apache.openjpa.jdbc.conf.JDBCConfigurationImpl.getConnectionFactory(JDBCConfigurationImpl.java:683) 
      at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
      at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
      at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
      at java.lang.reflect.Method.invoke(Method.java:597) 
      at org.apache.openjpa.lib.conf.ConfigurationImpl.instantiateAll(ConfigurationImpl.java:288) 
      at org.apache.openjpa.conf.OpenJPAConfigurationImpl.instantiateAll(OpenJPAConfigurationImpl.java:1409) 
      at org.apache.openjpa.kernel.AbstractBrokerFactory.makeReadOnly(AbstractBrokerFactory.java:646) 
      at org.apache.openjpa.kernel.AbstractBrokerFactory.newBroker(AbstractBrokerFactory.java:183) 
      at org.apache.openjpa.kernel.DelegatingBrokerFactory.newBroker(DelegatingBrokerFactory.java:142) 
      at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:192) 
      at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:145) 
      at org.apache.openjpa.persistence.EntityManagerFactoryImpl.createEntityManager(EntityManagerFactoryImpl.java:56) 
      at TxnClient.main(TxnClient.java:7) 
    Caused by: java.lang.ClassNotFoundException: org.apache.derby.jdbc.EmbeddedDriver 
      at java.net.URLClassLoader$1.run(URLClassLoader.java:200) 
      at java.security.AccessController.doPrivileged(Native Method) 
      at java.net.URLClassLoader.findClass(URLClassLoader.java:188) 
      at java.lang.ClassLoader.loadClass(ClassLoader.java:307) 
      at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:301) 
      at java.lang.ClassLoader.loadClass(ClassLoader.java:252) 
      at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:320) 
      at java.lang.Class.forName0(Native Method) 
      at java.lang.Class.forName(Class.java:169) 
      at org.apache.openjpa.jdbc.schema.DataSourceFactory.newDataSource(DataSourceFactory.java:85) 
      ... 15 more 

Répondre

2

ClassNotFoundException indique que la classe en question (org.apache.derby.jdbc.EmbeddedDrive) ne figure pas dans votre chemin de classe. Mettez-le (le pot de derby) là et essayez à nouveau.

3

Pour utiliser un pilote JDBC tiers qui n'est pas installé avec WebLogic Server, vous devez mettre à jour le CLASSPATH du serveur WebLogic pour inclure l'emplacement des classes de pilote JDBC. Editez le script commEnv.cmd/sh dans WL_HOME/common/bin et ajoutez vos cours.

Cela s'applique au pilote JDBC pour Derby (voir third party driver). Si vous ne savez pas où mettre le JAR, placez-le dans WL_HOME\server\lib avec d'autres pilotes JDBC fournis avec Weblogic. PS: Je me demande pourquoi vous n'utilisez pas Kodo qui est le moteur de persistance par défaut de WebLogic, mais c'est une autre histoire.