использование Spring PersistenceXmlLocation без <class>в persistence.xml - PullRequest
4 голосов
/ 09 августа 2011

Мой вопрос:

Есть ли способ заставить Spring / JPA автоматически обнаруживать классы, помеченные @Entity?

Справочная информация:

Это моя конфигурация entityManagerFactory

<bean id="entityManagerFactory" class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean">
    <property name="jpaVendorAdapter">
        <bean class="org.springframework.orm.jpa.vendor.HibernateJpaVendorAdapter" />
    </property>
</bean>

... а это мой файл persistence.xml ...

<persistence-unit name="foo">
  <provider>org.hibernate.ejb.HibernatePersistence</provider>
  <properties>
    <property name="hibernate..." value="..."/>
    <property ...
  </properties>
</persistence-unit>

Эта конфигурация работает. Но: когда я добавляю следующую строку в мою конфигурацию entityManagerFactory

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

JPA не находит мои классы с комментариями @Entity. Итак, я получаю исключения, подобные этой:

java.lang.IllegalArgumentException: Unknown entity: foo.Bar

где foo.Bar - класс, аннотированный @ javax.persistence.Entity

Когда я сейчас добавлю

<class>foo.Bar</class>

к моему persistence.xml все снова хорошо. Но почему я должен указывать свои классы в файле persistence.xml при использовании persistenceXmlLocation, а в противном случае - нет?

Примечание. Вы можете спросить, почему я хочу использовать persistenceXmlLocation: Это решило бы эту проблему .

Ответы [ 3 ]

2 голосов
/ 29 марта 2012

Вы не сказали точно, что было где, так что, возможно, я ошибаюсь, но похоже, что вы чувствуете себя в ловушке, в которую я попал. location файла persistence.xml определяет, где Spring (или любой поставщик JPA) будет искать классы @Entity по умолчанию.Из спецификации JPA , раздел 8.2.1

Файл persistence.xml определяет единицу сохранения.Файл persistence.xml находится в каталоге META-INF корня модуля сохранения. Он может использоваться для указания управляемых классов сохранения, включенных в модуль сохранения, информации об объектном / реляционном отображении для этих классов и другихинформация о конфигурации для модуля персистентности и для менеджера (ов) сущностей и фабрики менеджера сущностей для модуля персистентности.Эта информация может быть определена путем содержания или путем ссылки, как описано ниже.

Информация об объектном / реляционном отображении может принимать форму аннотаций к управляемым классам персистентности, включенным в блок персистентности , файл orm.xml, содержащийся в каталоге META-INF корневого каталога.модуля постоянства - один или несколько файлов XML в пути к классам, на которые ссылается файл persistence.xml, или их комбинация. Управляемые классы постоянства могут содержаться либо в корне модуля постоянства;или они могут быть указаны посредством ссылки, т. е. путем именования классов, архивов классов или файлов сопоставления XML (которые, в свою очередь, ссылаются на классы), которые доступны в пути к классам приложения;или они могут быть указаны с помощью некоторой комбинации этих средств.

Поэтому, хотя поле называется persistenceXmlLocation, его, вероятно, следует называть persistenceXmlName, поскольку цель состоит в том, чтобы иметь возможность создать постоянствоXML-файл с нестандартным именем, чтобы контейнер EE не мог его забрать.Он по-прежнему служит маркером того, где искать классы сущностей.

0 голосов
/ 25 февраля 2015

Для следующего исключения: Причина: javax.persistence.PersistenceException: Невозможно разрешить корневой URL-адрес модуля персистентности. в org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.determineDefaultPersistenceUnitRootUrl (DefaultPersistenceUnitManager.java:452) в org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.preparePersistenceUnitInfos (DefaultPersistenceUnitManager.java:343) в org.springframework.orm.jpa.persistenceunit.DefaultPersistenceUnitManager.afterPropertiesSet (DefaultPersistenceUnitManager.java:325) в org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory (LocalContainerEntityManagerFactoryBean.java:224) в org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet (AbstractEntityManagerFactoryBean.java:310) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods (AbstractAutowireCapableBeanFactory.java:1514) в org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean (AbstractAutowireCapableBeanFactory.java:1452) ... еще 14

В моем случае сам jar включал в себя META-INF / persistence.xml, который Spring не нашел, учитывая подсказку:

Наконец я сделал следующее:

java -classpath ".; My-jarThatIncludeTheMetaInfPersistence.jar" основные аргументы ...

и хитрость заключалась в добавлении "." в путь к классу. Затем Spring нашел XML-файл в classpath.

0 голосов
/ 16 августа 2014

(от Ю.Лева) Когда bean-компонент entityManagerFactory в spring-beans.xml поставляется со свойством location, а также с директивой classpath: Неважно, где в пути к классам (когда в eclipse ставится [bin] или [build]) его поместить.

1) В файле eclipse: persistence.xml в папке \ WebContent \ WEB-INF \ classes \ persistence.xml
2) В Tomcat: persistence.xml в папке \ WEB-INF \ classes \ persistence.xml
3) Когда нет в WEB-проекте, поместите его в [bin] или [build].

<bean id="entityManagerFactory" 
      class="org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean"
      lazy-init="false" p:dataSource-ref="dataSource">
    <property name="persistenceUnitName" value="empPU" />
    <property name="persistenceXmlLocation" value="classpath:persistence.xml"/>
</bean>     

Файл persistence.xml должен быть скопирован вручную где-нибудь под classpath .. \ Bin \ persistence.xml В противном случае это игнорируется !!!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...