Определить классы сущностей jpa вне файла persistence.xml
Есть ли способ определить классы сущностей jpa вне файла persistence.xml (т.е. в отдельном файле)?
Также было бы недостаточно иметь файл persistence.xml в качестве внешнего файла.
Заранее спасибо Стивен
Изменить: Извините, я не был ясен. Это в среде Java SE. Кроме того, я хотел бы, чтобы в моем файле persistence.xml не было листинга some.class.AClass. Это потому, что я хотел бы динамически создавать этот список классов и ссылаться на файл, содержащий этот список.
Edit2: удалось решить эту проблему, написав файл persistence.xml во время сборки, прежде чем он будет упакован. Если кому-то интересно, я использовал сканнотации, чтобы обнаружить все классы, аннотированные @Entity, и записал их в файл persistence.xml в target/classes/META-INF (используя maven).
2 ответа
В среде Java SE переносимые приложения должны явно указывать классы в persistence.xml
, Из спецификации JPA 1.0:
6.2.1.6 mapping-file, jar-file, class, exclude-unlisted-classes
Следующие классы должны быть неявно или явно обозначены как управляемые классы персистентности, чтобы быть включенными в блок персистентности: классы сущностей; встраиваемые классы; сопоставленные суперклассы.
Набор управляемых классов персистентности, которыми управляет блок персистентности, определяется с помощью одного или нескольких из следующих:
- Один или несколько файлов объектно-реляционного отображения XML
- Один или несколько файлов JAR, которые будут искать классы
- Явный список классов
- Аннотированные управляемые классы сохраняемости, содержащиеся в корне единицы сохраняемости (если только
exclude-unlisted-classes
элемент указан)(...)
Список именованных управляемых классов персистентности также может быть указан вместо файлов JAR и файлов сопоставления или в дополнение к ним. Любые аннотации метаданных отображения, найденные в этих классах, будут обработаны, или они будут отображены с использованием значений аннотаций отображения по умолчанию. Элемент class используется для вывода списка управляемых классов персистентности. Список всех именованных управляемых классов персистентности должен быть указан в средах Java SE для обеспечения мобильности. Портативные приложения Java SE не должны полагаться на другие механизмы, описанные здесь, для указания управляемых классов персистентности модуля персистентности. Поставщики постоянства могут также потребовать, чтобы набор классов сущностей и классов, которыми нужно управлять, должен быть полностью перечислен в каждом из
persistence.xml
файлы в средах Java SE.Все классы, содержащиеся в корне единицы сохраняемости, также ищут аннотированные управляемые классы постоянства, и любые найденные в них аннотации метаданных сопоставления будут обрабатываться или сопоставляться с использованием значений по умолчанию для сопоставления аннотаций. Если не предполагается, что аннотированные классы постоянства, содержащиеся в корне модуля постоянства, будут включены в модуль сохранения,
exclude-unlisted-classes
элемент должен быть использован.exclude-unlisted-classes
Элемент не предназначен для использования в средах Java SE.Результирующий набор сущностей, управляемых модулем постоянства, представляет собой объединение этих источников, причем аннотации метаданных отображения (или значения по умолчанию для аннотаций) для любого данного класса переопределяются информационным файлом отображения XML, если имеются как аннотации, так и отображения XML для этот класс. Минимальный переносимый уровень переопределения находится на уровне постоянного поля или свойства.
Если переносимость не имеет значения, некоторые поставщики поддерживают обнаружение объектов в среде Java SE (например, EclipseLink, Hibernate).
Если переносимость является проблемой, использование стороннего контейнера, такого как Spring, поможет.
Если вы хотите и можете упаковать свои классы сущностей в файл JAR вместе с файлом persistence.xml, вам не нужно перечислять каждую сущность в <class>
элемент. Когда JAR развертывается с файлом persistence.xml в каталоге META-INF, во время выполнения будет производиться поиск JAR для любых классов, которые имеют @Entity
аннотаций.