尝试将JPA与Derby一起使用时ClassNotFoundException:org.apache.derby.jdbc.EmbeddedDriver

我问过一个相关的查询: 如何配置和打包一个简单的Java应用程序来使用JPA

我有一个简单的Derby数据库,我可以通过WebLogic中托管的EJB连接到该数据库。 现在我想使用JPA从命令行Java应用程序连接到它。

到目前为止,这个Java代码+ persistence.xml文件引发了以下错误。 我究竟做错了什么?

我的目录布局:

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

独立客户端:

 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中

    Registrar       

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"  org.apache.openjpa.persistence.PersistenceException: There were errors initializing your configuration:  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 

ClassNotFoundException指示有问题的类( org.apache.derby.jdbc.EmbeddedDrive )不在您的类路径中。 把它(德比jar)放在那里再试一次。

要使用未随WebLogic Server一起安装的第三方JDBC驱动程序,需要更新WebLogic Server的CLASSPATH以包含JDBC驱动程序类的位置。 编辑WL_HOME/common/bincommEnv.cmd/sh脚本并预先添加类。

这适用于Derby的JDBC驱动程序(请参阅第三方驱动程序 )。 如果您不知道将JAR放在何处,请将其与其他与Weblogic捆绑在一起的JDBC驱动程序放在WL_HOME\server\lib

PS:我想知道你为什么不使用Kodo,这是WebLogic的默认持久性引擎,但这是另一个故事。