jpa,试图从实体创建表,找不到类 ExpressionVisitor

Posted

技术标签:

【中文标题】jpa,试图从实体创建表,找不到类 ExpressionVisitor【英文标题】:jpa, trying to create table from entities, class not found ExpressionVisitor 【发布时间】:2015-11-11 23:20:45 【问题描述】:

我在 Eclipse 中从实体创建表时遇到了一些麻烦。 这个项目最初是在 windows 上的 eclipse 上,我从 mysql 表创建实体并将其导入到项目中。一切都很好。昨天我决定从 windows 切换到 ubuntu,因此我只是备份了 eclipse 项目,认为无论如何我都可以从实体创建表。

所以当我右键单击项目 -> JPA 工具 -> 从实体创建表时,

我收到以下错误:

线程“主”本地异常堆栈中的异常: 异常 [EclipseLink-30005] (Eclipse Persistence Services - 2.6.0.v20140809-296a69f): org.eclipse.persistence.exceptions.PersistenceUnitLoadingException 异常描述:使用 ClassLoader 搜索持久性档案时引发异常:org.eclipse.persistence.dynamic.DynamicClassLoader@6eceb130 内部异常:javax.persistence.PersistenceException:异常 [EclipseLink-28018](Eclipse 持久性服务 - 2.6.0.v20140809-296a69f):org.eclipse.persistence.exceptions.EntityManagerSetupException 异常描述:PersistenceUnit [my-pu] 的预部署失败。 内部异常:java.lang.NoClassDefFoundError:org/eclipse/persistence/jpa/jpql/parser/ExpressionVisitor 在 org.eclipse.persistence.exceptions.PersistenceUnitLoadingException.exceptionSearchingForPersistenceResources(PersistenceUnitLoadingException.java:127) 在 org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactoryImpl(PersistenceProvider.java:107) 在 org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactory(PersistenceProvider.java:179) 在 javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:55) 在 org.eclipse.jpt.jpa.eclipselink.core.ddlgen.Main.buildEntityManagerFactory(Main.java:94) 在 org.eclipse.jpt.jpa.eclipselink.core.ddlgen.Main.execute(Main.java:80) 在 org.eclipse.jpt.jpa.eclipselink.core.ddlgen.Main.main(Main.java:68) 引起:javax.persistence.PersistenceException: 异常 [EclipseLink-28018] (Eclipse Persistence Services - 2.6.0.v20140809-296a69f): org.eclipse.persistence.exceptions.EntityManagerSetupException 异常描述:PersistenceUnit [my-pu] 的预部署失败。 内部异常:java.lang.NoClassDefFoundError:org/eclipse/persistence/jpa/jpql/parser/ExpressionVisitor 在 org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.createPredeployFailedPersistenceException(EntityManagerSetupImpl.java:1973) 在 org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1964) 在 org.eclipse.persistence.internal.jpa.deployment.JPAInitializer.callPredeploy(JPAInitializer.java:98) 在 org.eclipse.persistence.jpa.PersistenceProvider.createEntityManagerFactoryImpl(PersistenceProvider.java:96) ... 5 更多 原因:异常 [EclipseLink-28018] (Eclipse Persistence Services - 2.6.0.v20140809-296a69f): org.eclipse.persistence.exceptions.EntityManagerSetupException 异常描述:PersistenceUnit [my-pu] 的预部署失败。 内部异常:java.lang.NoClassDefFoundError:org/eclipse/persistence/jpa/jpql/parser/ExpressionVisitor 在 org.eclipse.persistence.exceptions.EntityManagerSetupException.predeployFailed(EntityManagerSetupException.java:231) ... 9 更多 引起:java.lang.NoClassDefFoundError: org/eclipse/persistence/jpa/jpql/parser/ExpressionVisitor 在 org.eclipse.persistence.internal.jpa.metadata.queries.NamedQueryMetadata.addJPAQuery(NamedQueryMetadata.java:105) 在 org.eclipse.persistence.internal.jpa.metadata.queries.NamedQueryMetadata.process(NamedQueryMetadata.java:192) 在 org.eclipse.persistence.internal.jpa.metadata.MetadataProject.processQueries(MetadataProject.java:1630) 在 org.eclipse.persistence.internal.jpa.metadata.MetadataProcessor.addNamedQueries(MetadataProcessor.java:148) 在 org.eclipse.persistence.internal.jpa.EntityManagerSetupImpl.predeploy(EntityManagerSetupImpl.java:1915) ... 7 更多 引起:java.lang.ClassNotFoundException:org.eclipse.persistence.jpa.jpql.parser.ExpressionVisitor 在 java.net.URLClassLoader.findClass(URLClassLoader.java:381) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:424) 在 sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:331) 在 java.lang.ClassLoader.loadClass(ClassLoader.java:357) ... 12 更多

Wildfly 默认使用 hibernate 作为 JPA 提供程序,我确实将它切换到 EclipseLink。

【问题讨论】:

【参考方案1】:

我在properties-> jpa中把目标库改成了用户定义的库。

然后我跟着这个 tut:https://www.youtube.com/watch?v=wjCCQSJVtVQ

基本上:

<persistence-unit name="my-pu" transaction-type="RESOURCE_LOCAL">
    <jta-data-source>java:/forumcsDS</jta-data-source>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>

    <properties>
        <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
        <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost:3306/forumcs"/>
        <property name="javax.persistence.jdbc.user" value="root"/>
        <property name="javax.persistence.jdbc.password" value="X"/>
        <property name="eclipseLink.ddl-generation" value="drop-and-create-tables"/>
        <property name="eclipseLink.ddl-generation.output-mode" value="database"/>

    </properties>
    </persistence-unit> 

然后我切换回旧的 persistence.xml

【讨论】:

【参考方案2】:

您需要在您的 persistence.xml 中将提供程序添加到 persistence-unit 并确保 Eclipse 链接 jar 在 Wildfly 类路径中

<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>

查看更多https://docs.jboss.org/author/display/WFLY8/JPA+Reference+Guide#JPAReferenceGuide-UpdateyourPersistence.xmlforHibernate4.3.0

【讨论】:

我已经有了持久化提供者:org.eclipse.persistence.jpa.PersistenceProvider

以上是关于jpa,试图从实体创建表,找不到类 ExpressionVisitor的主要内容,如果未能解决你的问题,请参考以下文章

在 Spring Boot JPA 中找不到实体列名称

从数据库创建 JPA

JPA创建实体类映射表+ 创建索引

JPA创建实体类映射表+ 创建索引

从 JPA 注释的实体类自动生成数据模式

Spring JPA - 找不到实体管理器工厂,为啥?