JPA persistence.xml META-INF работает неправильно
Я в тупике, когда речь заходит о местоположении моего файла persistence.xml. Я использую eclipselink 2.4 в качестве своей реализации JPA 2.0 и имею свой файл persistence.xml, расположенный под src/main/resources/META-INF/persistence.xml, поскольку количество сообщений указано.
Первая проблема: После публикации на моем сервере внутри eclipse я получаю сообщение об ошибке, указывающее, что мой persistence.xml не найден.
Exception: : java.lang.IllegalArgumentException: No persistence unit named 'X'
is available in scope Webapp. Available persistence units: [] at
![enter image description here]()
Вот код моего persistence.xml
<?xml version="1.0" encoding="UTF-8"?>
<persistence version="2.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_2_0.xsd">
<persistence-unit name="X" transaction-type="JTA">
<provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
<jta-data-source>localJTA</jta-data-source>
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<property name="eclipselink.target-server" value="WebLogic"/>
<property name="eclipselink.logging.level" value="FINEST"/>
</properties>
</persistence-unit>
</persistence>
Если я перемещаю META-INF в webapp/WEB-INF/classes/META-INF, тогда он работает! Я не понимаю, в чем проблема.
![enter image description here]()
Я проверил путь построения проектов, и там все хорошо выглядит.
![enter image description here]()
Вторая проблема, с которой я сталкиваюсь, заключается в том, что мой аннотированный класс сущностей автоматически не получает eclipselink. В моей конфигурации JPA у меня есть автоматически выбранные классы аннотированных подписей.
![enter image description here]()
У меня также есть следующее в моем xml
<exclude-unlisted-classes>false</exclude-unlisted-classes>
Используемые технологии: сервер weblogic 12c, EJB 3.1, JPA 2.0, M2E-WTP и JSF 2.1
Обновление 1: Выход из META-INF на пути src/main/resources/META-INF/persistence.xml и выполнение установки maven для создания военного файла, папка META-INF правильно помещается в WEB-INF/classes/META-INF/persistence.xml, как и должно быть (внутри войны). Кажется, что это только и проблема, когда webapp создается и запускается локально в Eclipse. Кто-нибудь может это объяснить?
Обновление 2: Выход из META-INF в src/main/resources
i.e src/main/resources/META-INF/persistence.xml
и следующее в моем persistence.xml, а не в явном перечислении класса сущности
<exclude-unlisted-classes>false</exclude-unlisted-classes>
работает, если я создаю войну и разворачиваю ее через консоль weblogic через Internet Explorer. Почему он не работает внутри eclipse!?
Обновление 3:
Вы проверили, что будет построено -Да, внутри Eclipse У меня есть сборка автоматически. Глядя в папку проекта, я вижу пакет java package com, папку META-INF, содержащую папку persistence.xml и ресурсов, которые находятся в разделе Webapp/target/classes.
Если война одинакова. Вы ссылаетесь на папку Webapp.war, найденную в C:\workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\Weblogic12cDomain_auto_generated_ear_\Webapp. война? Если это так, то есть только WEB-INF\lib\jsf-impl-2.1.7.jar
, то вы проверили путь к классам, который использовался для тестирования вашего приложения в Eclipse. Эта запись находится в моем пути к классам, как ожидалось в Webapp/.classpath
, если файл persistence.xml в каталоге ресурсов находится сначала в пути к классам, он будет выбран, а не тот, который находится в вашей войне, или один в правильном каталоге. Мое понимание - это создание Eclipse проекта, затем скопируйте содержимое на сервер без создания военного файла.
Вот что находится в основе созданного maven Webapp.war:
![enter image description here]()
Вот что находится в корне папки проекта Webapp:
![enter image description here]()
Вот что находится в корне папки Webapp.war FOLDER под C:\workspace.metadata.plugins\org.eclipse.wst.server.core\tmp0\Weblogic12cDomain_auto_generated_ear_\Webapp.war
![enter image description here]()
, если файл persistence.xml в каталоге ресурсов находится сначала в пути к классам, он будет выбран вместо того, который был в вашей войне, или один в правильной директории. - Не уверен, что вы имеете в виду этим. Persistence.xml в моем ресурсе /META -INF - это тот, который я хочу получить. Не знаете, какой военный файл имеет к этому отношение? В любом случае они должны быть одинаковыми persistence.xml, я бы подумал.
Любая помощь очень ценится!!
Ответы
Ответ 1
Раздел 8.2.1 спецификаций JPA указывает: "Файл persistence.xml находится в
META-INF-каталог корня блока персистентности. "И более поздние версии" Управляемые классы персистентности могут либо содержаться в корне единицы сохранения; или они
может быть задано посредством ссылки, то есть путем именования классов, архивов классов или файлов сопоставления XML
(которые, в свою очередь, ссылочные классы), которые доступны по пути класса приложения "
Итак, корень единицы персистентности - это каталог каталога каталога META-INF. Поместив классы в каталог классов, они не находятся в корневой части единицы персистентности и поэтому должны быть явно указаны для включения.
Ответ 2
Я считаю, что у вас есть как минимум 2 проблемы.
1) Maven build
В вашем проекте есть структура maven, а не структура веб-проекта Eclipse, поэтому она должна быть построена с использованием команд maven, а не сборки Eclipse по умолчанию. (Я не эксперт в maven, поэтому, пожалуйста, maven эксперты вскакивают и комментируют, если не правда). Поэтому, когда вы делаете автоматическую сборку в Eclipse, он не знает, что должен скопировать ваш src/main/resources/META-INF/persistence.xml в WEB-INF/classes/META-INF/persistence.xml и просто компилировать java классы.
2) Развертывание
Если вы следуете структуре проекта Eclipse, Eclipse знает, как упаковать и добавить проект на сервер, когда вы выбираете "Добавить на сервер". Если вы используете maven, ваша построенная война обычно находится в целевом каталоге. Таким образом, вам также нужно будет экспортировать эту войну и установить ее с помощью инструментов WebLogic или установить ее с помощью задачи maven.
Отметьте WebLogic Server с Maven и Eclipse, как Oracle предлагает использовать Eclipse с WebLogic и Maven
Ответ 3
Вы никогда не упоминаете maven, поэтому я не знаю, что это на вашей тарелке; он не работал у меня с maven, пока я не добавил зависимость hibernate-entitymanager. Мой pom.xml имел только спящий ядро. После того, как я добавил hibernate-entitymanager, он начал работать (для моего теста).
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.3.1.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-entitymanager</artifactId>
<version>4.3.1.Final</version>
</dependency>
Ответ 4
Проверьте, находится ли файл persistence.xml в вашей войне. Или это не так, но оно находится в неправильном месте.
Вы также можете поместить этот файл в папку java/main/resources, чтобы он был помещен в ваш путь к классу