В настоящее время я изучаю Hibernate и JPA, и я только что наткнулся на следующую проблему:
У меня есть класс сущности под названием User, и этот класс аннотирован аннотацией @Entity (JPA). В моем файле persistence.xml есть сопоставление НЕТ, но я могу без проблем использовать его в своем EntityManager.
Я только что создал еще один объект под названием Comment (некоторые пакеты ниже), он также аннотирован @Entity и также является НЕТ в моем файле persistence.xml. Однако это вызывает исключение org.hibernate.MappingException: Unknown entity при использовании в EntityManager.
Мой файл persistence.xml:
<?xml version = "1.0" encoding = "UTF-8"?>
<persistence version = "2.1"
xmlns = "http://xmlns.jcp.org/xml/ns/persistence" xmlns:xsi = "http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation = "http://xmlns.jcp.org/xml/ns/persistence
http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd">
<persistence-unit name = "net.notfab.hibernatetest" transaction-type = "RESOURCE_LOCAL">
<exclude-unlisted-classes>false</exclude-unlisted-classes>
<properties>
<!-- JPA Properties -->
<property name = "javax.persistence.provider" value = "org.hibernate.jpa.HibernatePersistenceProvider"/>
<property name = "javax.persistence.jdbc.driver" value = "org.mariadb.jdbc.Driver"/>
<property name = "javax.persistence.jdbc.url"
value = "jdbc:mariadb://IP:PORT...."/>
<property name = "javax.persistence.jdbc.user" value = ""/>
<property name = "javax.persistence.jdbc.password" value = ""/>
<!-- Hibernate Properties -->
<property name = "hibernate.connection.provider_class"
value = "org.hibernate.hikaricp.internal.HikariCPConnectionProvider"/>
<property name = "hibernate.dialect" value = "org.hibernate.dialect.MariaDBDialect"/>
<property name = "hibernate.connection.CharSet" value = "utf8mb4_bin"/>
<property name = "hibernate.connection.characterEncoding" value = "utf8mb4_bin"/>
<property name = "hibernate.connection.useUnicode" value = "true"/>
<property name = "hibernate.hbm2ddl.auto" value = "validate" />
<property name = "hibernate.archive.autodetection" value = "class, hbm" />
<!-- Hikari Properties -->
<property name = "hibernate.hikari.minimumIdle" value = "5"/>
<property name = "hibernate.hikari.maximumPoolSize" value = "10"/>
<property name = "hibernate.hikari.idleTimeout" value = "15000"/>
<property name = "hibernate.hikari.leakDetectionThreshold" value = "30000"/> <!-- 30 Seconds -->
<property name = "hibernate.hikari.poolName" value = "TestPool"/>
</properties>
</persistence-unit>
</persistence>
Что может быть причиной такого странного поведения?
Есть ли у меня способ продолжить использование аннотированных классов, не объявляя их в XML-файле? (Уже 2018 год - аннотации намного лучше!).
Примечание. Этот вопрос аналогичен, но их конечной целью стало отображение в XML, чего я стараюсь избегать всеми способами. Я также ищу объяснение вышеупомянутому поведению.
Обновлено: в соответствии с комментариями, вот полная трассировка стека https://hastebin.com/haguniheca.cs (а также здесь https://hasteb.in/ipuzojoc.cs на случай, если hastebin снова упадет).
В этом сценарии я не использую Spring.
Изменить 2: Здесь - моя сущность.
Изменить 3: это проект gradle, работающий из автономного (затененного) файла jar на Java SE, в настоящее время использующий следующий список зависимостей для сохранения (среди прочего):
compile group: 'org.hibernate', name: 'hibernate-hikaricp', version: '5.3.3.Final'
compile group: 'org.mariadb.jdbc', name: 'mariadb-java-client', version: '2.2.6'
Изменить 4: в соответствии с комментарием Евгения я провел некоторое тестирование, и причиной проблемы, похоже, является IntelliJ. Проблема устранена путем запуска затененного файла jar из командной строки. (Может быть, путь к классам отличается при запуске отладки приложения?). Тогда возникает вопрос: «Как я могу исправить конфигурацию запуска IntelliJ для моего приложения?».
@Spara Куда делись эти варианты? По свойствам? Под единицей настойчивости? Кстати, имейте в виду, что я не использую Spring в этом сценарии (я заметил, что Spring имеет режим «на основе аннотаций»).
@Spara OP не использует Spring.
Выложите, пожалуйста, исходный код Comments.
Отредактировано с использованием исходного кода объекта и трассировки стека. Простите меня за брань на ломбоке.
Это проект Maven?
Отредактировано еще раз со спецификациями о проекте и его стадии сборки.
Альтернативными вариантами являются использование сопоставления XML и сопоставления на основе аннотаций, поэтому, если он у вас есть, второй не нужен.
Вы уверены, что net.notfab.hibernatetest.entities нет в тестовой зоне?
Да, в настоящее время у меня нет тестов для этого проекта (папка с тестами пуста). После закрашивания jar файлы правильно перемещаются в корневую -> сетевую папку, а файл persistence.xml перемещается в папку META-INF.
Как вы ведете свой проект?
В настоящее время работает функция отладки (приложение) IntelliJ. Определен путь к классам для модуля _main (Hibernatetest_main).
Странно, попробуйте запустить исполняемый jar с java -jar ....
@EugenCovaci Странно, похоже, что запуск напрямую из командной строки вызвал исключение SchemaManagementException при запуске для одного из моих других объектов (который не генерировался при запуске из IntelliJ). Я собираюсь исправить это и посмотреть, сохраняется ли проблема за пределами IntelliJ, а затем правильно обновлю вопрос.
Как вы на самом деле знаете, что можете использовать эту сущность? Пожалуйста, включите тестовый код (даже самый тупой и простой)




Можете ли вы опубликовать трассировку стека ошибок? Также исходный код объекта ..