使用Hibernate映射文件的Spring Data JPA

4
我想使用Spring Data JPA与Hibernate映射文件,并且不使用JPA注解。
但是我在服务器启动时(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注解相关的IT技术内容。

感谢你的帮助!

1个回答

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网站上找到。双星号通配符意味着:在子目录中递归。它应该后跟斜杠,因为它代表一个目录。

ClasspathScanningPersistenceUnitPostProcessor

ClasspathScanningPersistenceUnitPostProcessor的映射文件检测部分考虑了两个参数(basePackage(您的构造函数参数)和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在没有根目录的情况下不支持带有通配符(*)的Ant样式路径模式(请参见这里这里其他注意事项中的第一个警告)。

ClasspathScanningPersistenceUnitPostProcessor的错误

这个类从来没有与Hibernate一起工作过。

在1.4.x之前的版本中,存在这个bug

通过这个pull request,似乎有一个新的bug阻止我在JAR中使用HBM时使整个系统工作。我在第146行得到了一个NullPointerException,因为resource.getURI().getPath();似乎无法处理URI中有两个:的协议(在这种情况下是jar:file:/),并返回空路径。

(当我找到或发布一个错误报告时,我将更新我的回答并附上链接。)


这是一个很好的描述,谢谢!我也对ClasspathScanningPersistenceUnitPostProcessor感到失望。 - The Alchemist

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接