我使用EclipseLink
作为我的JPA
实现。我们的项目有一个保存所有配置文件的目录,我想将我的persistence.xml文件存储在配置目录中,但找不到任何方法告诉createEntityManagerFactory
在那里查找持久性单元。
它不会直接回答您的问题,但如果您想这样做是为了外部化应用程序的配置,我认为最好的方法是将所有可配置的属性(如连接设置等)提取到一个单独的属性文件中,并将它们作为Map
传递给createEntityManagerFactory()
(还要注意,您可以通过这种方式覆盖persistence.xml
中的属性)。
然后,persistence.xml
将只包含不可配置的设置(如持久类列表等),也就是说,如果不重新构建整个应用程序,则更改这些属性是没有意义的,并且可以将其保留在默认位置。
您可以通过使用spring orm LocalContainerEntityManagerFactory来实现这一点(如果您不想使用所有的spring上下文内容,则不需要使用)。
LocalContainerEntityManagerFactory lcemf = new LocalContainerEntityManagerFactory ();
lcemf.setPersistenceUnitName("some_pu");
lcemf.setpersistenceXmlLocation("file:/data/config.xml");
EntityManagerFactory emf = lcemf.createNativeEntityManagerFactory();
您还可以一次性忽略xml,并使用LocalContainerEntityManagerFactory在代码中配置all(请参阅setPackagesToScan)。
persistence.xml
必须始终存在于类路径中的META-INF
目录中。关于不同类型的java应用程序应该在哪里显示META-INF的更多信息,可以在这里找到。
持久性单元由Persistence.xml配置文件定义。META-INF目录中包含persistence.xml的JAR文件或目录称为持久化单元的根。持久性单元的范围由持久性单元根决定。
每个持久性单元都必须用一个对持久性单元的作用域唯一的名称来标识。
持久单元可以打包为WAR或EJB JAR文件的一部分,也可以打包为JAR文件,然后将其包含在WAR或EAR文件中。
如果将持久单元打包为EJB JAR文件中的一组类,那么persistence.xml应该放在EJB JAR的META-INF目录中。
如果将持久性单元打包为WAR文件中的一组类,那么persistence.xml应该位于WAR文件的WEB-INF/classes/META-INF目录中。