【问题标题】:Spring Data JPA with Hibernate mapping files带有 Hibernate 映射文件的 Spring Data JPA
【发布时间】:2013-01-17 01:35:12
【问题描述】:

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

感谢您的帮助!

【问题讨论】:

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


    【解决方案1】:

    简述

    您的问题可能来自您提供的mappingFileNamePattern。试试**/*.hbm.xml 而不是**hbm.xml

    完成sn-p:

    <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

    ClasspathScanningPersistenceUnitPostProcessor 的映射文件检测部分考虑了两个参数(basePackage(您的构造函数参数)和mappingFileNamePattern)。通过建议的更正,Spring 将在类路径的子文件夹 org/xxxxxx/server/beans/ 中搜索所有 **.hbm.xml*。

    换个说法,您不能指望您的 mappingFileNamePattern 会被单独解释为搜索。

    下面是完成这项工作的ClasspathScanningPersistenceUnitPostProcessor 的代码sn-p:

    String path = ResourcePatternResolver.CLASSPATH_ALL_URL_PREFIX
        + basePackage.replace('.', File.separatorChar)
        + File.separator + mappingFileNamePattern;
    

    ClasspathScanningPersistenceUnitPostProcessor的小限制

    您无法扫描位于类路径中 JAR 文件根目录的 HBM 文件。 basePackage 不支持为空,并且不能仅使用 "." 值。

    此外,没有根目录(herehere)的底层 PathMatchingResourcePatternResolver 不适用于带有通配符(在您的情况下为 *)的 Ant 样式路径模式(其他注释中的第一个警告) ))。

    ClasspathScanningPersistenceUnitPostProcessor 的错误

    这个类从来没有使用过 Hibernate。

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

    对于this pull request,似乎有一个新错误阻止我在 JAR 中使用 HBM 进行整个工作。我在第 146 行得到了 NullPointerException,因为 resource.getURI().getPath(); 似乎不适用于协议中带有两个 : 的 URI(jar:file:/本例)并返回一个null 路径。

    (当我找到或发布错误报告时,我将使用指向错误报告的链接更新我的答案。)

    【讨论】:

    • 描述得很好,谢谢!我对 ClasspathScanningPersistenceUnitPostProcessor 也很失望
    猜你喜欢
    • 2015-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-17
    • 1970-01-01
    • 1970-01-01
    • 2017-07-17
    • 2019-08-12
    相关资源
    最近更新 更多