Нужны ли мне элементы в файле persistence.xml?

У меня очень простой файл persistance.xml:

   pl.michalmech.eventractor.domain.User pl.michalmech.eventractor.domain.Address pl.michalmech.eventractor.domain.City pl.michalmech.eventractor.domain.Country       

и это работает.

Но когда я @Entity элементы приложение не видит сущности (все classы аннотируются с @Entity ).

Есть ли какой-либо автоматический механизм для сканирования classов @Entity ?

У persistence.xml есть jar-file который вы можете использовать. Из учебника Java EE 5 :

   This unit manages orders and customers. It does not rely on any vendor-specific features and can therefore be deployed to any persistence provider.  jdbc/MyOrderDB MyOrderApp.jar com.widgets.Order com.widgets.Customer   

В этом файле определяется единица сохранения с именем OrderManagement , в котором используется JTA-источник данных jdbc/MyOrderDB . Элементы jar-file и class определяют управляемые classы персистентности: classы сущностей, встраиваемые classы и сопоставленные суперclassы. Элемент jar-file указывает JAR-файлы, которые видны в упакованном модуле персистентности, который содержит управляемые classы персистентности, тогда как элемент class явно называет управляемые classы персистентности.

В случае спящего режима взгляните на главу 2. Настройка и настройка также для более подробной информации.

EDIT: На самом деле, если вы не возражаете против того, чтобы не соответствовать спецификации, Hibernate поддерживает автоматическое обнаружение даже в Java SE. Для этого добавьте свойство hibernate.archive.autodetection :

          

В среде Java SE по спецификации вам необходимо указать все classы, как вы это делали:

Список всех названных управляемых classов персистентности должен быть указан в средах Java SE для обеспечения переносимости

а также

Если не предполагается, что аннотированные classы персистентности, содержащиеся в корневой части единицы персистентности, будут включены в блок персистентности, следует использовать элемент exclude-unlisted-classes. Элемент exclude-unlisted-classes не предназначен для использования в средах Java SE.

(JSR-000220, 6.2.1.6)

В средах Java EE вам не нужно это делать, поскольку поставщик сканирует annotations для вас.

Неофициально вы можете установить false в свой файл persistence.xml. Этот параметр по умолчанию равен false в EE и true в SE. И EclipseLink, и Toplink поддерживают это, насколько я могу судить. Но вы не должны полагаться на это, работая в SE, согласно спецификации, как указано выше.

Вы можете ПОПРОСИТЬ следующее (может или не может работать в средах SE):

  false      

Нужны ли элементы classа в файле persistence.xml?

Нет, ты не обязательно. Вот как вы это делаете в Eclipse (Кеплер):

Щелкните правой кнопкой мыши по проекту, выберите « Свойства» , выберите « JPA» , в поле « Управление classом« Удержание »автоматически выберите« Аннотированные classы » .

введите описание изображения здесь

Для тех, кто работает с JPA весной, начиная с версии 3.1, вы можете установить свойство packagesToScan в LocalContainerEntityManagerFactoryBean и полностью избавиться от persistence.xml.

Вот нижний

для JPA 2+ это делает трюк

   

сканировать все банки в войне для аннотированных classов @Entity

Hibernate не поддерживает false под SE, (еще один плакат упоминает, что это работает с TopLink и EclipseLink).

Существуют инструменты, которые автоматически генерируют список classов для persistence.xml, например мастера импорта базы данных базы данных в IntelliJ. Когда у вас есть начальные classы вашего проекта в persistence.xml, должно быть просто добавить / удалить отдельные classы вручную по мере продвижения вашего проекта.

Вы можете jar-file путь элемента jar-file к папке с скомпилированными classами. Например, я добавил что-то подобное, когда я подготовил persistence.xml к некоторым интеграционным тестам:

  file:../target/classes 

Не уверен, что вы делаете что-то похожее на то, что я делаю, но Im генерирует загрузку исходной java из XSD, используя JAXB в отдельном компоненте с использованием Maven. Допустим, этот артефакт называется «базовой моделью»,

Я хотел импортировать этот артефакт, содержащий источник java, и запускать hibernate для всех classов в банке артефакта «базовая модель» и не указывать каждый явно. Я добавляю «базовую модель» в качестве зависимости для моего спящего компонента, но проблема заключается в теге в persistence.xml, который позволяет вам указывать абсолютные пути.

То, как я обошел это, – это явно скопировать мою зависимость «базовой модели» к моей целевой директории, а также удалить ее версию. Итак, если я создаю артефакт «базовой модели», он генерирует «base-model-1.0-SNAPSHOT.jar», шаг копирования-ресурсов копирует его как «base-model.jar».

Итак, в вашем помпе для спящего компонента:

    org.apache.maven.plugins maven-dependency-plugin 2.5.1   copy-dependencies process-resources  copy-dependencies     base-model true   

Затем я вызываю плагин hibernate в следующей фазе «process-classes»:

    org.codehaus.mojo hibernate3-maven-plugin 2.2   generate-ddl process-classes  hbm2ddl       hbm2java annotationconfiguration /src/main/java    mysql jpaconfiguration true false true mysql-schema.sql    

и, наконец, в моем persistence.xml я могу явным образом установить расположение банки таким образом:

 target/dependency/base-model.jar 

и добавьте свойство:

  

Это не решение, а подсказка для тех, кто использует Spring:

Я попытался использовать org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean с настройкой persistenceXmlLocation но с этим я должен был предоставить элементы (даже если persistenceXmlLocation указала только на META-INF/persistence.xml ).

Если вы не используете persistenceXmlLocation я могу опустить эти элементы .

Я не уверен, что это решение находится под спецификацией, но я думаю, что могу поделиться другими.

дерево зависимостей

мой-entities.jar

Содержит только classы объектов. Нет META-INF/persistence.xml .

мой-services.jar

Зависит от my-entities . Содержит только EJB.

мой-resources.jar

Зависит от my-services . Содержит classы ресурсов и META-INF/persistence.xml .

проблемы

  • Как мы можем указать элемент в my-resources как имя артефакта с измененной версией переходной зависимости?
  • Как мы можем синхронизировать значение элемента и фактическое значение переходной зависимости?

решение

прямая (избыточная?) зависимость и фильтрация ресурсов

Я поместил свойство и зависимость в my-resources/pom.xml .

  xyz-SNAPSHOT     ... my-entities ${my-entities.version} compile    ... my-services some.very.sepecific compile   

Теперь получите persistence.xml готовый к фильтрации

    ... lib/my-entities-${my-entities.version}.jar ...   

Плагин Maven Enforcer

С правилом dependencyConvergence мы можем гарантировать, что версия my-entities одинакова как в прямой, так и в транзитивной.

  org.apache.maven.plugins maven-enforcer-plugin 1.4.1   enforce       enforce     
  • Что такое «собственная сторона» в сопоставлении ORM?
  • Как использовать hibernate с MS Access?
  • Ошибка: java.lang.NoSuchMethodError: org.objectweb.asm.ClassWriter. (I) V
  • В чем разница между @JoinColumn и mappedBy при использовании ассоциации JPA @OneToMany
  • Сохранение карты с использованием JPA
  • LINQ To Entities не распознает метод Last. В самом деле?
  • JPA CriteriaBuilder - Как использовать оператор сравнения «IN»
  • Есть ли способ вызвать хранимую процедуру с помощью Dapper?
  • Как использовать Hibernate @ Любые связанные annotations?
  • mappedBy ссылается на неизвестное свойство целевого объекта
  • Каковы преимущества использования ORM?
  • Давайте будем гением компьютера.