Нужны ли мне элементы в файле 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
).
- EntityManager закрыт
- В чем разница между persist () и merge () в Hibernate?
- .net ORM Сравнение
- Django - id vs pk
- Hibernate - @ElementCollection - странное поведение удаления / вставки
Есть ли какой-либо автоматический механизм для сканирования classов @Entity
?
- Почему Hibernate не требует конструктора аргументов?
- Пакетные вставки с JPA / EJB3
- Hibernate, iBatis, Java EE или другой инструмент Java ORM
- Как следует использовать равенства и hash-код при использовании JPA и Hibernate
- В чем разница между однонаправленными и двунаправленными ассоциациями JPA и Hibernate?
- объект ссылается на несохраненный экземпляр переходного процесса - сохраняет временный экземпляр перед промывкой
- Как аннотировать поле автоинкремента MYSQL с аннотациями JPA
- Автоматическое резервирование зарезервированного слова для таблиц и столбцов Hibernate
У 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 для вас.
Неофициально вы можете установить
в свой файл 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 не поддерживает
под 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