java - JPA/Hibernate 部署后找不到映射的类

标签 java eclipse hibernate jpa

简短版本

我有一个 Java 项目,它使用 JPA 2.0Hibernate 4.3.4。当我在 Eclipse 中运行它时一切都很好。但是,当我让 Eclipse 导出可运行的 JAR 时,麻烦就开始了,程序因看似丢失的持久性单元而崩溃......

javax.persistence.PersistenceException: No Persistence provider for EntityManager named MyDBManager
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:61)

...看似未映射的类...

3024 Thread-4| FATAL DbManager : DBManager could not load countries from database.
java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Country is not mapped [SELECT x FROM Country x]
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1750)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1683)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:331)

背景

根据导出的类型(提取、打包、复制库),我遇到了不同的错误,无法解决。我得到的最远的是最后一种方法,这也是我出于许可原因必须选择的方法,所以让我们重点关注那个方法。

在这种情况下,导出的 JAR 无法查看其 persistence.xml。我稍后会详细说明,但首先是一些背景信息......

文件夹结构

  • 某个文件夹
    • myproject_lib
    • myproject.jar
      • 我的项目包结构的根
      • 元信息
        • 持久性.xml

文件persistence.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    <persistence-unit name="MyDBManager" transaction-type="RESOURCE_LOCAL">
        <!-- <exclude-unlisted-classes>false</exclude-unlisted-classes> -->
        <!-- <class>isi.eload.core.Country</class> -->
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
            <!-- Do not define a connection here - this is done by the DbManager according to the command line arguments -->
            <property name="hibernate.id.new_generator_mappings" value="true" />
            <!-- <property name="hibernate.archive.autodetection" value="class, hbm" /> -->
        </properties>
    </persistence-unit>
</persistence>

一旦我觉得 xml 确实被处理了(见下文),我就尝试了注释行,但这没有帮助。

JPA/Hibernate JAR

基本上是 4.3.4 Final Release 中的那些:

  • antlr-2.7.7
  • dom4j-1.6.1
  • hibernate-commons-annotations-4.0.4.Final
  • hibernate-core-4.3.4.Final
  • hibernate-entitymanager-4.3.4.Final
  • hibernate-jpa-2.1-api-1.0.0.Final
  • jandex-1.1.0.Final
  • javassist-3.18.1-GA
  • jboss-logging-3.1.3.GA
  • jboss-logging-annotations-1.2.0.Beta1
  • jboss-transaction-api_1.2_spec-1.0.0.Final

.

persistence.xml 失败

打包元信息

正如我之前暗示的那样,导出的 JAR 无法正确处理 persistence.xml。当我在上面的文件夹结构中执行它时,抛出以下异常:

javax.persistence.PersistenceException: No Persistence provider for EntityManager named MyDBManager
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:61)

当找到文件但为 Persistence.createEntityManagerFactory 指定的持久性单元名称与文件中声明的任何持久性单元不匹配时,通常会引发此异常。但这里绝对不是这种情况! 我不知道为什么会抛出这个异常。

当我编辑 JAR 文件(尽管我不确定这种篡改本身不会导致问题)并清空或删除 persistence.xml 时,错误仍然存​​在。

另一个元信息

我的第一个 react 是复制 JAR 旁边的 meta-inf 文件夹:

  • myproject_lib
  • myproject.jar
    • ...不变...
  • 元信息
    • 持久性.xml

这似乎有效,因为现在可以创建实体管理器工厂。但随后没有找到任何实体,我认为这与实际使用的 persistence.xml 与 JAR 文件“不在同一类路径上”这一事实有关。

有链接或想法可以帮助我解决这个问题吗?最好强制 JAR 文件使用它本身包含的 meta-inf 文件夹。

最佳答案

META-INF 需要大写。如果 Java 尝试访问 Windows(或 OS X)上的文件系统,META-INF/persistence.xml 将由操作系统自动转换为 meta-inf/persistence.xml。一旦将其打包到 JAR 中,它就会变得区分大小写并停止工作。

关于java - JPA/Hibernate 部署后找不到映射的类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22675723/

相关文章:

java - android - 从 .java 文件控制 XML 文件时出现 NullPointerException

java - 检测 JDBC 连接中尚未提交的打开事务

java - FlowStarter 类型中的方法 startFlow(FlowLogic<? extends T>, InvocationContext) 不适用于参数

eclipse - 从 POSTMAN 向我的 java api POST 时出现 405 响应代码

python - Pydev 找不到 matplotlib 模块

java - 无法获取连接惰性初始化集合

java - 模型属性的 spring MockMvc 测试

java - AutoValue 无法解析为类型 - Eclipse

java - 使用 JPA 和 Hibernate 时,PostgreSQL date_trunc ('day' , (entity.date AT TIME ZONE 'UTC' )) 函数的 JPQL 等价物是什么

java - matlab 和企业应用程序