带有Hibernate映射文件的Spring Data JPA

时间:2013-02-01 17:04:18

标签: java spring hibernate hibernate-mapping spring-data-jpa

我想将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。

感谢您的帮助!

1 个答案:

答案 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>

详情

Ant路径模式

Spring使用Ant路径样式模式。您可以在Ant Website上找到有关这些模式的详细文档。双星号通配符表示:递归子目录。它后面应该是一个斜杠,因为它代表一个目录。

ClasspathScanningPersistenceUnitPostProcessor

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样式路径模式,而没有根目录(herehere其他注释中的第一个警告))。

ClasspathScanningPersistenceUnitPostProcessor

的错误

这个类从未使用过Hibernate。

在1.4.x之前的版本中,有this bug

使用this pull request,似乎有一个新的错误阻止我在JAR中使用HBM。我在第146行得到NullPointerException,因为resource.getURI().getPath();似乎无法使用协议中包含两个的URI( jar:file:/ < / em>在这种情况下)并返回null路径。

(当我找到错误报告或发布错误报告时,我会用错误报告的链接更新我的回答。)