Spring 3.1 без persistence.xml выдает «Не удается разрешить корневой URL-адрес единицы сохранения»

#hibernate #spring #jpa-2.0

#переход в спящий режим #spring #jpa-2.0

Вопрос:

Я пытаюсь использовать загрузку JPA EntityManagerFactory без 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>
  

Но при запуске приложения появляется PersistenceException сообщение «Не удается разрешить корневой URL-адрес модуля сохранения»:

 ...
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 , ошибка остается.

редактировать удаленное persistenceUnitName в соответствии с удаленным комментарием; переименовал компоненты в имя единицы сохранения (для @PersistenceContext )

обновление похоже, что эта ошибка зависит от того, какой тип загрузчика контекста приложения используется. Код работает в тестировании spring / junit через @ContextConfiguration , но не через ClassPathXmlApplicationContext

Ответ №1:

Это ошибка весной, я сообщил об этом.

Обратите внимание, что это происходит только для упакованного приложения, когда все элементы classpath являются jars. Вот почему он не завершается сбоем в модульных тестах.

Комментарии:

1. Отлично, я думаю, я сохраню свой минимальный persistence.xml на данный момент и посмотрите, как они реагируют на сообщение об ошибке.

2. Есть новости по этому поводу? Дата выпуска 1.1.1 указана сегодня?

3. Обратите внимание, что, несмотря на то, что ошибка была закрыта как исправленная в 3.1.1, она все еще исправлена в 3.1.2

Ответ №2:

Я не думаю, что этот класс позволяет вам полностью удалить persistence.xml файл. Из его javadoc:

«Однако этот FactoryBean более гибкий, поскольку вы можете переопределить местоположение persistence.xml файл, укажите источники данных JDBC для ссылки и т.д.»

Я думаю, что это позволяет вам иметь минимальный persistence.xml файл, а затем позволяет дополнительно настроить EMF профессионально через прослушиватели и т.д.

Комментарии:

1. Действительно? В документе, на который я ссылался, говорится: «Фактически, это позволяет настроить JPA без XML за счет простого указания базового пакета для сканирования объектов»

2. Также «В случае сканирования на основе Spring, нет persistence.xml необходимо; «из static.springsource.org/spring/docs/3.1.0.RC1/javadoc-api/org /…

3. Ну, вы неправильно скопировали код парня. Его: <имя свойства=»jpaPropertyMap»> нет <имя свойства =»jpaProperties»>. И вам также нужно добавить <имя свойства=»JpaVendorAdapter»>.

4. jpaProperties и jpaPropertyMap оба допустимы и выполняют одно и то же. Я добавил JpaVendorAdapter, но ошибка остается.

5. Извините, но это предел всех моих знаний по этому вопросу. Не принимайте во внимание, что это не окончательный выпуск этой версии Spring, поэтому вы, возможно, наткнулись на ошибку.