我想将Spring Data JPA与Hibernate映射文件一起使用,而不使用JPA-Annotations。
但是我在服务器启动时遇到了这个异常(tomcat):
java.lang.IllegalStateException: No persistence units parsed from {classpath*:META-INF/persistence.xml}
at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.obtainDefaultPersistenceUnitInfo(DefaultPersistenceUnitManager.java:547)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.determinePersistenceUnitInfo(LocalContainerEntityManagerFactoryBean.java:311)
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:260)
My dispatch-servlet.xml looks like the following:
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<!--<property name="persistenceUnitName" value="BLUPP" />-->
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" />
<!-- <property name="packagesToScan" value="org.cleanyourway.server.beans" />-->
<property name="persistenceUnitPostProcessors">
<list>
<bean
class="org.springframework.data.jpa.support.ClasspathScanningPersistenceUnitPostProcessor">
<constructor-arg value="org.xxxxxx.server.beans" />
<property name="mappingFileNamePattern" value="**hbm.xml" />
</bean>
</list>
</property>
</bean>
是否可以将Hibernate映射文件与ClasspathScanningPersistenceUnitPostProcessor一起使用?
我用
运行它<property name="packagesToScan" value="org.xxxxxxx.server.beans" />
和JPA Annotations。
感谢您的帮助!
答案 0 :(得分:5)
您的问题可能来自您提供的mappingFileNamePattern
。请尝试使用**/*.hbm.xml
代替**hbm.xml
。
完整代码段:
<bean id="entityManagerFactory"
class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
<!--<property name="persistenceUnitName" value="BLUPP" />-->
<property name="dataSource" ref="dataSource" />
<property name="jpaVendorAdapter" ref="hibernateJpaVendorAdapter" />
<!-- <property name="packagesToScan" value="org.cleanyourway.server.beans" />-->
<property name="persistenceUnitPostProcessors">
<list>
<bean
class="org.springframework.data.jpa.support.ClasspathScanningPersistenceUnitPostProcessor">
<constructor-arg name="basePackage" value="org.xxxxxx.server.beans" />
<property name="mappingFileNamePattern" value="**/*hbm.xml" />
</bean>
</list>
</property>
</bean>
Spring使用Ant路径样式模式。您可以在Ant Website上找到有关这些模式的详细文档。双星号通配符表示:递归子目录。它后面应该是一个斜杠,因为它代表一个目录。
ClasspathScanningPersistenceUnitPostProcessor
的映射文件检测部分考虑了两个参数(basePackage
(您的构造函数args)和mappingFileNamePattern
)。根据建议的更正,Spring将在类路径的子文件夹 org / xxxxxx / server / beans / 中搜索所有** .hbm.xml *。
重新表述,您不能指望您的mappingFileNamePattern
会被单独解释为搜索。
在下文中,ClasspathScanningPersistenceUnitPostProcessor
的代码片段可以完成这项工作:
String path = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
+ basePackage.replace('.', File.separatorChar)
+ File.separator + mappingFileNamePattern;
ClasspathScanningPersistenceUnitPostProcessor
您无法扫描位于类路径中JAR文件根目录的HBM文件。 basePackage
不支持为空,仅支持"."
值。
此外,基础PathMatchingResourcePatternResolver
不适用于具有wilcard(在您的情况下为*
)的Ant样式路径模式,而没有根目录(here和here( 其他注释中的第一个警告))。
ClasspathScanningPersistenceUnitPostProcessor
这个类从未使用过Hibernate。
在1.4.x之前的版本中,有this bug。
使用this pull request,似乎有一个新的错误阻止我在JAR中使用HBM。我在第146行得到NullPointerException
,因为resource.getURI().getPath();
似乎无法使用协议中包含两个:的URI( jar:file:/ < / em>在这种情况下)并返回null
路径。
(当我找到错误报告或发布错误报告时,我会用错误报告的链接更新我的回答。)