JPA / Hibernate не находит сопоставленные классы после развертывания

1

Укороченная версия

У меня есть Java-проект, который использует JPA 2.0 с Hibernate 4.3.4. Все нормально, когда я запускаю его внутри Eclipse. Но когда я позволяю Eclipse экспортировать runnable JAR, проблема начинается, и программа вылетает из-за, казалось бы, отсутствующей единицы непрерывности...

javax.persistence.PersistenceException: No Persistence provider for EntityManager named MyDBManager
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:61)

... или, казалось бы, неотображаемые классы...

3024 Thread-4| FATAL DbManager : DBManager could not load countries from database.
java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Country is not mapped [SELECT x FROM Country x]
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1750)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1677)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1683)
at org.hibernate.jpa.spi.AbstractEntityManagerImpl.createQuery(AbstractEntityManagerImpl.java:331)

,

Задний план

В зависимости от вида экспорта (извлечение против упаковки или копирование библиотек) я сталкиваюсь с различными ошибками, которые противостоят решению. Самое большее, что я получаю, - это последний подход, который также я должен выбрать по причинам лицензии, поэтому позвольте сосредоточиться на этом.

В этом случае экспортируемый JAR не просматривает свой файл persistence.xml. Я уточню, что позже, но сначала некоторую справочную информацию...

Структура папок

  • some_folder
    • myproject_lib
    • myproject.jar
      • корень моей структуры пакета проектов
      • мета-инф
        • persistence.xml

persistence.xml

<persistence xmlns="http://java.sun.com/xml/ns/persistence" version="2.0">
    <persistence-unit name="MyDBManager" transaction-type="RESOURCE_LOCAL">
        <!-- <exclude-unlisted-classes>false</exclude-unlisted-classes> -->
        <!-- <class>isi.eload.core.Country</class> -->
        <properties>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" />
            <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" />
            <!-- Do not define a connection here - this is done by the DbManager according to the command line arguments -->
            <property name="hibernate.id.new_generator_mappings" value="true" />
            <!-- <property name="hibernate.archive.autodetection" value="class, hbm" /> -->
        </properties>
    </persistence-unit>
</persistence>

Я играл с комментариями, когда я почувствовал, что xml фактически обработан (см. Ниже), но это не помогло.

JPA/Hibernate JARs

По сути, из 4.3.4 Final Release:

  • ANTLR-2.7.7
  • dom4j-1.6.1
  • hibernate-commons-annotations-4.0.4.Final
  • hibernate-core-4.3.4.Final
  • hibernate-entitymanager-4.3.4.Final
  • hibernate-jpa-2.1-api-1.0.0.Final
  • jandex-1.1.0.Final
  • Javassist-3.18.1-GA
  • jboss-logging-3.1.3.GA
  • JBoss-каротаж аннотации-1.2.0.Beta1
  • jboss-transaction-api_1.2_spec-1.0.0.Final

,

Неудача с persistence.xml

Упакованный мета-инф.

Как я уже указывал ранее, экспортированный JAR не смог обработать файл persistence.xml. Когда я выполняю его в вышеуказанной структуре папок, генерируется следующее исключение:

javax.persistence.PersistenceException: No Persistence provider for EntityManager named MyDBManager
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:61)

Это исключение обычно вызывается, когда файл был найден, но имя единицы сохранения, присвоенное Persistence.createEntityManagerFactory, не соответствует какой-либо единице сохранения, объявленной в файлах. Но это определенно не так! У меня нет хорошей идеи, почему это исключение выбрано.

Когда я редактирую банку (хотя я не уверен, что такая подделка не вызывает проблем сама по себе) и пустая или удаляющая persistence.xml, ошибка остается прежней.

Другая мета-инфо

Мой первый ответ заключался в том, чтобы скопировать папку meta-inf рядом с JAR:

  • myproject_lib
  • myproject.jar
    • ... без изменений...
  • мета-инф
    • persistence.xml

Это, похоже, работает, так как теперь можно создать фабрику менеджера объектов. Но тогда никаких сущностей не найдено, и я думаю, что это связано с тем фактом, что используемый persistence.xml не является "на том же пути класса", что и JAR.

У кого-нибудь есть ссылка или идея, как я могу это исправить? Предпочтительно, заставляя банку использовать папку meta-inf, которая она содержит.

  • 0
    META-INF должен быть в верхнем регистре. Я подозреваю, что вы работаете в Windows, поэтому, если Java пытается получить доступ к файловой системе, META-INF / persistence.xml будет автоматически переведен операционной системой в meta-inf / persistence.xml. Как только вы упаковываете его в JAR, он становится чувствительным к регистру и перестает работать.
  • 0
    Вау! Он знал, что это будет что-то тривиальное, но это просто смешно! Часы, которые я потратил впустую ... Пожалуйста, сделайте это ответом, и я приму, поддержу и поклонюсь этому в святыне RTFM. ;)
Показать ещё 1 комментарий
Теги:
hibernate
jpa

1 ответ

1
Лучший ответ

META-INF должен быть в верхнем регистре. Если Java пытается получить доступ к файловой системе в Windows (или OSX в этом отношении), META-INF/persistence.xml будет автоматически переведена в meta-inf/persistence.xml операционной системой. Как только вы упаковываете его в JAR, он становится чувствительным к регистру и перестает работать.

  • 0
    Еще раз спасибо. :)
  • 0
    Добро пожаловать :)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню