У меня очень простой файл persistance.xml:
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="1.0"
xmlns="http://java.sun.com/xml/ns/persistence" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
<persistence-unit name="eventractor" transaction-type="RESOURCE_LOCAL">
<class>pl.michalmech.eventractor.domain.User</class>
<class>pl.michalmech.eventractor.domain.Address</class>
<class>pl.michalmech.eventractor.domain.City</class>
<class>pl.michalmech.eventractor.domain.Country</class>
<properties>
<property name="hibernate.hbm2ddl.auto" value="validate" />
<property name="hibernate.show_sql" value="true" />
</properties>
</persistence-unit>
</persistence>
и это работает.
Но когда я удаляю <class>
элементы, приложение не видит сущностей (все классы помечены @Entity
).
Есть ли какой-нибудь автоматический механизм для поиска @Entity
классов?
В среде Java SE по спецификации вы должны указать все классы, как вы это сделали:
и
(JSR-000220 6.2.1.6)
В средах Java EE этого делать не нужно, поскольку провайдер сканирует для вас аннотации.
Неофициально можно попробовать установить
<exclude-unlisted-classes>false</exclude-unlisted-classes>
в своем persistence.xml. По умолчанию этот параметр установленfalse
в EE иtrue
SE. Оба EclipseLink и Toplink поддерживает это, насколько я могу сказать. Но вы не должны полагаться на его работу в SE, согласно спецификации, как указано выше.Вы можете ПОПРОБОВАТЬ следующее (может работать или не работать в SE-средах):
источник
<exclude-unlisted-classes>false</exclude-unlisted-classes>
не работал с WildFly 8.2.1.Final + Hibernate 4.3.7Нет, не обязательно. Вот как это делается в Eclipse (проверено Кеплером):
Щелкните проект правой кнопкой мыши, выберите " Свойства" , выберите " JPA" и в разделе " Управление классами сохраняемости" отметьте " Автоматически обнаруживать аннотированные классы" .
источник
persistence.xml
что генерирует Eclipse.Для тех, кто использует JPA в Spring, начиная с версии 3.1, вы можете установить
packagesToScan
свойство в разделеLocalContainerEntityManagerFactoryBean
и полностью избавиться от persistence.xml.Вот подноготная
источник
Вы можете
jar-file
указать путь элемента к папке со скомпилированными классами. Например, я добавил что-то подобное, когда готовил persistence.xml к некоторым интеграционным тестам:источник
для JPA 2+ это трюк
сканировать все банки на войне на предмет аннотированных классов @Entity
источник
java.lang.IllegalArgumentException: Unable to visit JAR file:
).Hibernate не поддерживает
<exclude-unlisted-classes>false</exclude-unlisted-classes>
SE (другой плакат упомянул, что это работает с TopLink и EclipseLink).Существуют инструменты, которые автоматически создают список классов в persistence.xml, например, мастер импорта схемы базы данных в IntelliJ. После того, как у вас есть начальные классы вашего проекта в persistence.xml, должно быть легко добавлять / удалять отдельные классы вручную по мере продвижения вашего проекта.
источник
Не уверен, что вы делаете что-то похожее на то, что делаю я, но я генерирую загрузку исходного кода java из XSD с использованием JAXB в отдельном компоненте с помощью Maven. Допустим, этот артефакт называется «базовая модель».
Я хотел импортировать этот артефакт, содержащий исходный код java, и запустить спящий режим для всех классов в моем банке артефактов «базовой модели» и не указывать каждый явно. Я добавляю «базовую модель» в качестве зависимости для моего компонента спящего режима, но проблема в том, что тег в persistence.xml позволяет указывать только абсолютные пути.
Способ, которым я это обошел, - это явно скопировать мою зависимость jar «базовой модели» в мой целевой каталог, а также удалить ее версию. Итак, если я создаю свой артефакт «базовая модель», он генерирует «base-model-1.0-SNAPSHOT.jar», шаг копирования ресурсов копирует его как «base-model.jar».
Итак, в вашем pom для компонента гибернации:
Затем я вызываю плагин hibernate на следующем этапе «process-classes»:
и, наконец, в моем persistence.xml я могу явно указать местоположение банки следующим образом:
и добавьте свойство:
источник
Это не решение, а подсказка для тех, кто использует Spring:
Я попытался использовать
org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean
с настройкой,persistenceXmlLocation
но с этим мне пришлось предоставить<class>
элементы (даже если ониpersistenceXmlLocation
только что указалиMETA-INF/persistence.xml
).Когда я не использую,
persistenceXmlLocation
я мог опустить эти<class>
элементы.источник
persistenceXmlLocation
свойство в своихLocalContainerEntityManagerFactoryBean
настройках. Но все запросы работают, даже если я опущу<class>
элементы. Это приложение Spring / Hibernate / Maven. Но в вашем намеке вы говорите, что «Если не использовать persistenceXmlLocation, я мог бы опустить эти элементы <class>». но для меня все наоборот.Я не уверен, что это решение соответствует спецификации, но думаю, что могу поделиться с другими.
дерево зависимостей
my-entity.jar
Содержит только классы сущностей. Нет
META-INF/persistence.xml
.my-services.jar
Зависит от
my-entities
. Содержит только EJB.my-resources.jar
Зависит от
my-services
. Содержит классы ресурсов иMETA-INF/persistence.xml
.проблемы
<jar-file/>
элемент вmy-resources
качестве имени артефакта с постфиксом версии временной зависимости?<jar-file/>
элемента и фактическую временную зависимость?решение
прямая (избыточная?) зависимость и фильтрация ресурсов
Я помещаю свойство и зависимость
my-resources/pom.xml
.Теперь
persistence.xml
приготовьтесь к фильтрацииПлагин Maven Enforcer
С помощью
dependencyConvergence
правила мы можем гарантировать, чтоmy-entities
'версия одинакова как для прямой, так и для транзитивной.источник
Не обязательно во всех случаях.
Я использую Jboss 7.0.8 и Eclipselink 2.7.0. В моем случае для загрузки сущностей без добавления их в persistence.xml я добавил следующее системное свойство в Jboss Standalone XML:
<property name="eclipselink.archive.factory" value="org.jipijapa.eclipselink.JBossArchiveFactoryImpl"/>
источник