尝试将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/bin
的commEnv.cmd/sh
脚本并预先添加类。
这适用于Derby的JDBC驱动程序(请参阅第三方驱动程序 )。 如果您不知道将JAR放在何处,请将其与其他与Weblogic捆绑在一起的JDBC驱动程序放在WL_HOME\server\lib
。
PS:我想知道你为什么不使用Kodo,这是WebLogic的默认持久性引擎,但这是另一个故事。