我有一个使用 JPA 2.0 和 Hibernate 4.3.4 的Java项目。当我在 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。我稍后会指出一些背景资料......
<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实际上已被处理(见下文),我就用评论的线条玩了一下,但这并没有帮助。
基本上来自4.3.4 Final Release:
正如我之前所暗示的那样,导出的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,但错误保持不变。
我的第一反应是复制JAR旁边的 meta-inf 文件夹:
这似乎有效,因为现在可以创建实体管理器工厂。但是后来没有找到任何实体,我认为这与实际使用的persistence.xml不在同一类路径上的事实有关。作为JAR。
有任何人可以通过链接或想法解决这个问题吗?优选地,通过强制jar使用它自己包含的meta-inf文件夹。
答案 0 :(得分:1)
META-INF
需要大写。如果Java试图访问Windows(或OSX)上的文件系统,META-INF/persistence.xml
将由操作系统自动转换为meta-inf/persistence.xml
。一旦将其打包到JAR,它就会区分大小写并停止工作。