Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Hibernate 在web应用程序中引用jpa persistence.xml中的jar文件的正确路径是什么?_Hibernate_Jpa_Persistence_Java Ee 6_War - Fatal编程技术网

Hibernate 在web应用程序中引用jpa persistence.xml中的jar文件的正确路径是什么?

Hibernate 在web应用程序中引用jpa persistence.xml中的jar文件的正确路径是什么?,hibernate,jpa,persistence,java-ee-6,war,Hibernate,Jpa,Persistence,Java Ee 6,War,persistence.xml如下所示: <persistence-unit name="testPU" transaction-type="RESOURCE_LOCAL"> <provider>org.hibernate.ejb.HibernatePersistence</provider> <non-jta-data-source>jdbc/test</non-jta-data-source> <jar

persistence.xml如下所示:

<persistence-unit name="testPU" transaction-type="RESOURCE_LOCAL">
    <provider>org.hibernate.ejb.HibernatePersistence</provider>
    <non-jta-data-source>jdbc/test</non-jta-data-source>
    <jar-file>../../lib/app-services-1.0.jar</jar-file>
    <exclude-unlisted-classes>false</exclude-unlisted-classes>
</persistence-unit>

org.hibernate.ejb.HibernatePersistence
jdbc/测试
../../lib/app-services-1.0.jar
假的
它是一个web项目,因此部署单元是一个war文件。 我试图引用的jar文件位于WEB-INF/lib/文件夹中,persistence.xml位于WEB-INF/classes/META-INF文件夹中。在部署时,它只是告诉我

“警告:找不到文件(已忽略):文件:…/../lib/app-services-1.0.jar”

我还尝试了我能想到的所有可能的途径,即。/lib/app-services-1.0.jarlib/app-services-1.0.jar


做这件事的正确路径是什么?

不确定这是否与您作为WAR部署的事实有关,但路径应该只是“app-sevices-1.0.jar”,jar应该在JavaEE应用程序的lib中。问题是:我不确定这是否适用于简化的“war”JavaEE应用程序。我怀疑这只适用于传统的JavaEE部署文件(ear)。我将测试制作一个EAR,包含webapp的WAR、PU的JAR和其他应用服务的JAR,就像传统的JavaEE部署一样


另外需要注意的是,不支持相对路径,并且并非所有供应商都支持在SE环境中使用相对路径

以防万一其他人偶然发现:jar file语句仅有效。当持久性单元作为企业档案(.ear)的一部分部署时,每隔(.war)一次,persistence.xml必须驻留在/META-INF/中,并且不能引用驻留在持久性单元之外的类(请参阅:)。所以,据我所知,没有办法让persistence.xml存在于WEB-INF/classes/META-INF中,它引用的类不存在于WEB-INF/classes中

看看jsr总是有用的

8.2.1.6.3 Jar文件

可以使用
JAR文件
元素而不是
映射文件
元素指定一个或多个JAR文件,或者除了在
映射文件
元素中指定的映射文件之外指定一个或多个JAR文件。如果指定,将在这些JAR文件中搜索托管持久性类,并处理在这些JAR文件上找到的任何映射元数据注释,或者使用本规范定义的映射注释默认值映射这些JAR文件。 此类JAR文件是相对于包含persis tence单元根的目录或JAR文件指定的

下面的示例演示了如何使用
jar文件
元素来引用其他持久性类。这些示例使用的约定是,名称以“PUnit”结尾的jar文件包含
persistence.xml
文件,名称以“Entities”结尾的jar文件包含其他持久性类

示例1:
app.ear
lib/eartentities.jar
arrootpunit.jar(带META-INF/persistence.xml)
persistence.xml包含:
lib/eartentities.jar
例2:
app.ear
lib/eartentities.jar
lib/earLibPUnit.jar(带有META-INF/persistence.xml)
persistence.xml包含:
earEntities.jar
例3:
app.ear
lib/eartentities.jar
ejbjar.jar(带有META-INF/persistence.xml)
persistence.xml包含:
lib/eartentities.jar
例4:
app.ear
战争
WEB-INF/lib/warEntities.jar
WEB-INF/lib/warPUnit.jar(带META-INF/persistence.xml)
persistence.xml包含:
warEntities.jar
例5:
app.ear
战争2.战争
WEB-INF/lib/warEntities.jar
WEB-INF/classes/META-INF/persistence.xml
persistence.xml包含:
lib/warEntities.jar
例6:
app.ear
lib/eartentities.jar
战争2.战争
WEB-INF/classes/META-INF/persistence.xml
persistence.xml包含:
../../lib/eartenties.jar
例7:
app.ear
lib/eartentities.jar
战争
WEB-INF/lib/warPUnit.jar(带META-INF/persistence.xml)
persistence.xml包含:
../../../lib/eartenties.jar
正如您看到的,没有war文件的示例,上面示例中的所有war文件都是ear文件
但我在war文件中进行了测试,当我指定jar文件的绝对路径时,它才起作用,对于生产环境来说,这不是一个好方法

war2.war
war2.war
      WEB-INF/lib/warEntities.jar
      WEB-INF/classes/META-INF/persistence.xml
persistence.xml contains:
   <jar-file>lib/warEntities.jar</jar-file>
WEB-INF/lib/warEntities.jar WEB-INF/classes/META-INF/persistence.xml persistence.xml包含: lib/warEntities.jar

这种格式适用于war文件。我使用的是Wildlfy 8.2.0和JPA 2.1

您运行应用程序的服务器是什么?JBoss?玻璃鱼?如果它是JBoss,那么根本不需要指定Hibernate;这是默认值。玻璃鱼,马特。我的问题不在于Hibernate与否,而在于如何告诉JPA提供者jar文件的路径,以便自动扫描实体。尝试了简单的“app-services-1.0.jar”路径,正如您所怀疑的,它不起作用。所以我想问题是战争文件,那就是不能使用?我想,就像ear文件一样,战争文件也可以这样做,但在尝试了很多之后,我看到了你的帖子,明白战争文件是不可能的!但有趣的是,当我在文件系统中指定jar文件的“绝对路径”时,它就工作了!;)你的回答完全不正确。实体类不能强制位于充当持久性根的JAR文件中。一点也不。我知道,在Weblogic、Glassfish和Tomcate中,WAR文件可以完美地包含一个内部JAR文件,该文件保存META-INF/persistence.xml,并且通过使用JAR file元素和其他JAR的名称,非常简单地引用同一lib文件夹中的其他JAR文件。您也可以在JPA2.1 JSR的第367和368页中看到这种情况。话虽如此,在Wildfly 10中实现这一点是一个挑战。从这里下载JSR:这是最好的答案,因为它给出了为jar文件元素输入内容的示例。“已经证实它也能工作了。”海德扎德说
war2.war
      WEB-INF/lib/warEntities.jar
      WEB-INF/classes/META-INF/persistence.xml
persistence.xml contains:
   <jar-file>lib/warEntities.jar</jar-file>