2011-11-08 17 views
9

Estoy tratando de usar JPA EntityManagerFactory bootstrapping without persistence.xml, que es nuevo en Spring 3.1 (desde M2), pero parece que la primavera todavía está buscando un archivo persistence.xml , a pesar de que se especifica packagesToScan.Spring 3.1 sin persistencia.xml da "No se puede resolver la URL raíz de unidad de persistencia"

En context.xml, la EntityManagerFactory está configurado de esta manera:

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

Pero al iniciar la aplicación, un PersistenceException con el mensaje "No se puede resolver URL raíz unidad de persistencia" situaciones:

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

Antes Agregué packagesToScan, tenía un persistence.xml mínimo, y configuré el persistenceXmlLocation, así:

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

que funcionó bien. Entonces, ¿qué estoy haciendo incorrectamente ahora?

editar sumado jpaVendorAdapter, el error permanece.

editar removed persistenceUnitName por un comentario eliminado; habas cambia al nombre de la unidad de persistencia (por @PersistenceContext)

actualización este error parece depender sobre la cual se utiliza tipo de aplicación contextual de carga. El código funciona en una prueba de primavera/junio a través de @ContextConfiguration, pero no a través de ClassPathXmlApplicationContext

Respuesta

9

Es un error en la primavera, que reported it.

Tenga en cuenta que solo ocurre para una aplicación empaquetada, cuando todos los elementos de classpath son jar. Es por eso que no falla en las pruebas unitarias.

+0

Eliminar esto no hizo diferencia; mismo error. – beerbajay

+0

@beerbajay: Actualizado. – axtavt

+0

Genial, supongo que mantendré mi mínima persistencia.xml por ahora y ver cómo responden al informe de errores. – beerbajay

0

No creo que esta clase le permita eliminar completamente el archivo persistence.xml. Desde su javadoc:

"Sin embargo, este FactoryBean es más flexible ya que puede anular la ubicación del archivo persistence.xml, especificar el JDBC DataSources para enlazar, etc."

Creo que lo que hace es permitir que usted tenga un archivo mínimo persistence.xml y luego le permiten configurar aún más el EMF proframatically a través de los oyentes etc.

+1

¿De verdad? El documento al que me he conectado dice "Efectivamente, esto permite la configuración JPA sin XML por el mero gasto de especificar un paquete base para el escaneo de entidades" – beerbajay

+2

También "En el caso del escaneo basado en Spring, no es necesario persistence.xml;" de http://static.springsource.org/spring/docs/3.1.0.RC1/javadoc-api/org/springframework/orm/jpa/LocalContainerEntityManagerFactoryBean.html#setPackagesToScan%28java.lang.String...%29 – beerbajay

+0

Bueno, copiaste el código del tipo equivocado. Its: not . Y también debe agregar . –

Cuestiones relacionadas