Как исправить отображение не найденного исключения для Hibernate 5?

Здравствуйте, я новичок в спящем режиме и сейчас пытаюсь что-то сделать на практике. Но есть некоторые ошибки.

Я пытаюсь использовать Hibernate в моем проекте. Я прочитал учебник и начинаю интегрировать Hibernate в свой проект Java Maven. Итак, в первую очередь я добавил следующие зависимости:

<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>5.0.6.Final</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-c3p0</artifactId>
<version>5.0.6.Final</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>

Следующим шагом было добавление файла hibernate.cfg.xml в каталог src / main / resources. Этот файл выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE hibernate-configuration PUBLIC
  "-//Hibernate/Hibernate Configuration DTD 3.0//EN"
  "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>
  <session-factory>
    <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property>
    <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>

    <property name="hibernate.connection.url">jdbc:mysql://localhost/testprojectdatabase</property>
    <property name="hibernate.connection.username">username_here</property>
    <property name="hibernate.connection.password">password_here</property>

    <property name="hibernate.connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property>
    <property name="hibernate.c3p0.min_size">5</property>
    <property name="hibernate.c3p0.max_size">20</property>
    <property name="hibernate.c3p0.timeout">300</property>
    <property name="hibernate.c3p0.max_statements">50</property>

    <mapping resource="milkiv/mytestproject/models/UserInfo.hbm.xml"/>
  </session-factory>
</hibernate-configuration>

Тогда я создаю UserInfo.java для картирования user_info стол и положить его внутрь src/main/java/milkiv/mytestproject/models/UserInfo.java, а также UserInfo.hbm.xml файл, который я положил внутрь src/main/resources/milkiv/mytestproject/models/UserInfo.hbm.xml,

Я также создал класс UserInfoManager которые выглядят как:

public class UserInfoManager implements ManagerAdd<UserInfo> {
    private final SessionFactory factory;

    public UserInfoManager() {
    factory = new Configuration().configure("hibernate.cfg.xml").buildSessionFactory();
    }

    public int add(UserInfo user) {
    Transaction transaction = null;
    Integer userId = null;
    try (Session session = factory.openSession()){
        transaction = session.beginTransaction();
        userId = (Integer) session.save(user);
        transaction.commit();
    } catch (HibernateException he) {
        if (transaction != null) {
        transaction.rollback();
        }
    }
    return userId;
    }
}

Когда я пытаюсь создать тест для метода add(UserInfo user) это не удалось на UserInfoManager конструктор при инициализации фабрики из-за

Mapping (RESOURCE) not found : milkiv/mytestproject/models/UserInfo.hbm.xml : origin(milkiv/mytestproject/models/UserInfo.hbm.xml)

Так что в конце концов я знаю, где, но не знаю, как это исправить. Я прочитал много ответов на эти вопросы на stackru, но никто не помог мне исправить эту ошибку.

Буду признателен за любые идеи, помощь и объяснения, как решить эту проблему...

полная трассировка стека: сопоставление (RESOURCE) не найдено: milkiv/mytestproject/models/UserInfo.hbm.xml: происхождение (milkiv/mytestproject/models/UserInfo.hbm.xml) org.hibernate.boot.MappingNotFoundException в org.hibernate.boot.spi.XmlMappingBinderAccess.bind(XmlMappingBinderAccess.java:56) в org.hibernate.boot.MetadataSources.addResource(MetadataSources.java:274) в org.hibernate.boot.cfgxml.spi.MappingReference.app) в org.hibernate.boot.internal.MetadataBuilderImpl.build(MetadataBuilderImpl.java:413) в org.hibernate.boot.internal.MetadataBuilderImpl.build (MetadataBuilderImpl.jildf. Configuration.java:692) в org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:724) в milkiv.mytestproject.managers.UserInfoManager.(UserInfoManager.java:22) в milkiv.mytestproject.managers.UserInfoManagerTest.testAdd(UserInfoManagerTest.java:24) в sun.reflect.NativeMethodAccessorImpl.invoke0(собственный метод) в sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) в sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) в java.lang.rejj.tj.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) в org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) в org.junit.runners.moetFloraExlopeFore FrameworkMethod.java:41) в org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) в org.junit.runners.BlockJUnit4ClassRunner.runNotIgnored(BlockJUnitr.junRjun.junR).BlockJUnit4ClassRunner..runners.ParentRunner$1.schedule(ParentRunner.java:52) в org.junit.runners.ParentRunner.runChildren(ParentRunner.java:191) в org.junit.runners.ParentRunner.access$000(ParentRunner.java:42) в org.junit.runners.ParentRunner$2.оценке (ParentRunner.java:184) в org.junit.runners.Parent.run(ParentRunner.java:236) в org.apache.maven.surefire.junit4.JUnit4Provider.execute(JUnit4Provider.java:252) в org.apache.maven.surefire.junit4.JUnit4Provider.executeUitet4. sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) в java.lang.reflect.Method.invoke(Method.java:497) в org.apache.maven.surefire.util.ReflectionUrays.Withj. 189) в org.apache.maven.surefire.booter.ProviderFactory$ProviderProxy.invoke(ProviderFactory.java:165) в org.apache.maven.surefire.booter.ProviderFactory.invokeProvider(ProviderFactory.java:85) в org.apache.maven.surefire.booter.ForkedBooter.runSuitesInProcess(ForkedBooter.java:115) в org.apache.maven.surefire.booter.ForkedBooter.Footer:75)

ОБНОВЛЕНИЕЕсли кому-то нужно, решение в комментариях к @v.ladynev.

2 ответа

Решение

Я проверяю ваш подход, и все работает отлично.

Когда вы положите UserInfo.hbm.xml в src/main/resources/milkiv/mytestproject/models/UserInfo.hbm.xml

это появится в

bin/milkiv/mytestproject/models/UserInfo.hbm.xml

после сборки (вместо bin может быть вашей папкой сборки).

Так /milkiv/mytestproject/models/ выглядит как другие исходные пакеты в папке сборки. Пожалуйста, проверь это. Проверьте, что у вас есть resource папка в пути к классам.

Попробуй добавить / в начале

<mapping resource="/milkiv/mytestproject/models/UserInfo.hbm.xml"/>

Обновить

Добавление / в начале не имеет значения, потому что из Hibernate удалите его перед загрузкой ClassLoader, Так что самый верный способ - без / в начале.

Попробуй поставить UserInfo.hbm.xml в корне resources

<mapping resource="UserInfo.hbm.xml"/>

Обновить

Попробуй проверить

 public UserInfoManager() {
        System.out.println(UserInfoManager.class
                .getResource("/milkiv/mytestproject/models/UserInfo.hbm.xml"));

        System.out.println(ClassLoader.getSystemClassLoader().getResource(
                "milkiv/mytestproject/models/UserInfo.hbm.xml"));
}

Примечание ведущий / в первом случае. Какой консольный вывод после

new UserInfoManager();

@NickolasUA вы используете Hibernate 5. Поэтому измените последнюю строку в hibernate.cfg.xml

<mapping class="milkiv.mytestproject.models.UserInfo.hbm.xml"/>
Другие вопросы по тегам