【问题标题】:Spring 3.1 without persistence.xml gives "Unable to resolve persistence unit root URL"没有 persistence.xml 的 Spring 3.1 给出“无法解析持久性单元根 URL”
【发布时间】:2011-11-08 15:07:02
【问题描述】:

我正在尝试使用 JPA EntityManagerFactory bootstrapping without persistence.xml,这是 Spring 3.1(自 M2 起)中的新功能,但似乎 spring 仍在搜索 persistence.xml 文件,尽管指定了 packagesToScan

在 context.xml 中,entityManagerFactory 是这样配置的:

<bean id="my-persistence-unit"
    class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="dataSource" ref="dataSource"/>
    <property name="persistenceProviderClass"
        value="org.hibernate.ejb.HibernatePersistence"/>
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter"/>
    </property>
    <property name="jpaProperties">
        <props>
            <prop key="hibernate.dialect">org.hibernate.dialect.PostgreSQLDialect</prop>
        </props>
    </property>
    <property name="packagesToScan">
        <list>
            <value>my.package.name</value>
        </list>
    </property>
</bean>

但在应用程序启动时,会出现带有消息“无法解析持久性单元根 URL”的 PersistenceException

...
Caused by: org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'my-persistence-unit' defined in class path resource [META-INF/context.xml]: 
...
Caused by: javax.persistence.PersistenceException: Unable to resolve persistence unit root URL
        at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.determineDefaultPersistenceUnitRootUrl(DefaultPersistenceUnitManager.java:429)
        at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.preparePersistenceUnitInfos(DefaultPersistenceUnitManager.java:327)
        at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.afterPropertiesSet(DefaultPersistenceUnitManager.java:309)
        at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:209)
        at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:310)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1504)
        at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1442)
        ... 34 more 
Caused by: java.io.FileNotFoundException: class path resource [] cannot be resolved to URL because it does not exist
        at org.springframework.core.io.ClassPathResource.getURL(ClassPathResource.java:179)
        at org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.determineDefaultPersistenceUnitRootUrl(DefaultPersistenceUnitManager.java:426)
        ... 40 more

在我添加packagesToScan之前,我有一个最小的persistence.xml,并设置persistenceXmlLocation,如下所示:

<property name="persistenceXmlLocation"
    value="classpath:META-INF/persistence.xml"/>

效果很好。那我现在做错了什么?

编辑添加了jpaVendorAdapter,错误仍然存​​在。

edit 根据已删除的评论删除了 persistenceUnitName;将 bean 重命名为持久性单元名称(对于 @PersistenceContext

update 这个错误似乎取决于使用了哪种应用程序上下文加载器。该代码通过@ContextConfiguration 在spring/junit 测试中工作,但不能通过ClassPathXmlApplicationContext 工作

【问题讨论】:

    标签: hibernate spring jpa-2.0


    【解决方案1】:

    这是Spring的一个bug,我reported it

    请注意,当所有类路径项都是 jar 时,它只会发生在打包的应用程序中。这就是它在单元测试中不会失败的原因。

    【讨论】:

    • 太好了,我想我会暂时保留我的最小persistence.xml,看看他们如何响应错误报告。
    • 有这方面的消息吗? 1.1.1 的发布日期是今天?
    • 请注意,尽管在 3.1.1 中修复了该错误,但它在 3.1.2 中仍然被破坏
    【解决方案2】:

    我不认为这个类允许你完全删除 persistence.xml 文件。从它的javadoc:

    “但是,这个 FactoryBean 更灵活,您可以覆盖 persistence.xml 文件的位置,指定要链接到的 JDBC 数据源等等。”

    我认为它的作用是让您拥有一个最小的 persistence.xml 文件,然后让您通过侦听器等进一步配置 EMF。

    【讨论】:

    • 真的吗?我链接到的文档说“实际上,这允许以指定用于实体扫描的基本包为代价进行无 XML 的 JPA 设置”
    • 还有“在基于 Spring 的扫描的情况下,不需要 persistence.xml;”来自static.springsource.org/spring/docs/3.1.0.RC1/javadoc-api/org/…
    • 好吧,你把那家伙的代码复制错了。它的: 不是 。您还需要添加
    • jpaProperties 和 jpaPropertyMap 都是有效的,并且做同样的事情。我添加了 jpaVendorAdapter,但错误仍然存​​在。
    • 我很抱歉,但这是我在这方面的所有知识的范围。不要以为这不是这个 Spring 版本的最终版本,所以你可能会偶然发现一个错误。
    猜你喜欢
    • 1970-01-01
    • 2019-05-03
    • 2012-07-24
    • 2018-10-23
    • 2014-10-02
    • 2017-02-03
    • 1970-01-01
    • 1970-01-01
    • 2023-03-18
    相关资源
    最近更新 更多