Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Spring 3.1 without persistence.xml gives "Unable to resolve persistence unit root URL"

I'm trying to use JPA EntityManagerFactory bootstrapping without persistence.xml, which is new in Spring 3.1 (since M2), but it appears that spring is still searching for a persistence.xml file, despite the fact that packagesToScan is specified.

In context.xml, the entityManagerFactory is configured thusly:

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

But on application startup, a PersistenceException with message "Unable to resolve persistence unit root URL" occurs:

...
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

Before I added packagesToScan, I had a minimal persistence.xml, and set the persistenceXmlLocation, like so:

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

which worked fine. So what am I doing incorrectly now?

edit added jpaVendorAdapter, error remains.

edit removed persistenceUnitName per a deleted comment; renamed beans to the persistence unit name (for @PersistenceContext)

update this error seems to depend upon which kind of application context loader is used. The code works in a spring/junit test via @ContextConfiguration, but not via ClassPathXmlApplicationContext

like image 784
beerbajay Avatar asked Nov 08 '11 15:11

beerbajay


People also ask

Does spring boot need persistence xml?

Spring Boot will not search for or use a META-INF/persistence. xml by default. If you prefer to use a traditional persistence. xml , you need to define your own @Bean of type LocalEntityManagerFactoryBean (with an ID of 'entityManagerFactory') and set the persistence unit name there.

What is persistence unit in persistence xml?

A persistence unit defines a set of all entity classes that are managed by EntityManager instances in an application. This set of entity classes represents the data contained within a single data store.

Where do I put persistence xml?

If you package the persistent unit as a set of classes in an EJB JAR file, persistence. xml should be put in the EJB JAR's META-INF directory. If you package the persistence unit as a set of classes in a WAR file, persistence. xml should be located in the WAR file's WEB-INF/classes/META-INF directory.

Why do we need persistence xml?

xml File. This file is used to override the default Hibernate settings and to add support for database types that are not out of the box (OOB database types are Oracle Server, Microsoft SQL Server, and MySQL).


1 Answers

It's a bug in Spring, I reported it.

Note that it happens only for a packaged application, when all classpath items are jars. That's why it doesn't fail in unit tests.

like image 159
axtavt Avatar answered Sep 23 '22 17:09

axtavt