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, чтобы он был помещен в ваш путь к классу