Хобрук: Ваш путь к мастерству в программировании

JPA — createEntityManagerFactory возвращает Null

Нубский вопрос здесь. Я следую этому примеру/учебнику чтобы попытаться изолировать проблему, с которой я постоянно сталкиваюсь в своем основном проекте. Проблема в том, что entityManagerFactory продолжает возвращать null (таким образом, я получаю NullPointerExcept при попытке запустить первый тест JUnit).

В настоящее время я использую Eclipse Indigo (JavaEE) - JRE7 - Hibernate 3.6.7 и JBoss 7.

А вот и мой файл persistence.xml (опять же, копипаста, взятая прямо из туториала)

<persistence>
        <persistence-unit name="examplePersistenceUnit" 
                          transaction-type="RESOURCE_LOCAL">
            <properties>
                <property name="hibernate.show_sql" value="false" />
                <property name="hibernate.format_sql" value="false" />

                <property name="hibernate.connection.driver_class" 
                          value="org.hsqldb.jdbcDriver" />
                <property name="hibernate.connection.url" 
                          value="jdbc:hsqldb:mem:mem:aname" />
                <property name="hibernate.connection.username" value="sa" />

                <property name="hibernate.dialect" 
                          value="org.hibernate.dialect.HSQLDialect" />
                <property name="hibernate.hbm2ddl.auto" value="create" />
            </properties>
        </persistence-unit>
    </persistence>

Вещи, которые я уже пробовал/узнал до сих пор:

  • Кажется, эта проблема имеет тенденцию возникать, если вы пытаетесь создать фабрику с постоянством модуль, который не указан в файле persistence.xml

  • Дважды проверил, что необходимые JAR-файлы включены в библиотеки путей сборки Eclipse, что, по предположению Google, может быть возможной причиной короткого замыкания вызова createEntityManagerFactory() и возврата null (вместо того, чтобы просто генерировать исключение или регистрировать сообщение)

  • Может быть из-за возможной ошибки при настройке подключения к гибернации?

Я бился об эту стену последние пару недель, поэтому само собой разумеется, что любая помощь / общие советы по направлению очень ценятся: D


Ответы:


1

Гастон, у меня есть несколько предложений/вопросов к вам:

1 – Это тот код, который вы пытаетесь выполнить?

package entity;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;

import org.apache.log4j.BasicConfigurator;
import org.apache.log4j.Level;
import org.apache.log4j.Logger;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;

public class PersonTest {
    private EntityManagerFactory emf;

    private EntityManager em;

    @Before
    public void initEmfAndEm() {
        BasicConfigurator.configure();
        Logger.getLogger("org").setLevel(Level.ERROR);

        emf = Persistence.createEntityManagerFactory("examplePersistenceUnit");
        em = emf.createEntityManager();
    }

    @After
    public void cleanup() {
        em.close();
    }

    @Test
    public void emptyTest() {
    }
}

Если это так, попробуйте прокомментировать эту строку: "Logger.getLogger("org").setLevel(Level.ERROR);". Или измените его на "Logger.getLogger("org").setLevel(Level.ALL);". Затем вы должны увидеть ошибки на консоли вывода.

2. В вашем файле persistence.xml я вижу, что вы используете базу данных hsqldb. Правильно ли вы установили/настроили его?

Если вы не знакомы с этой базой данных, я предлагаю вам использовать MySQL, PostgreSQL или другую базу данных, с которой вы знакомы.

3 – проверьте файл 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="App1PU" transaction-type="RESOURCE_LOCAL">
        <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
        <class>com.entities.User</class>
        <class>com.entities.Group</class>
        <properties>
            <property name="javax.persistence.jdbc.url" value="jdbc:mysql://myIP:3306/mydatabase"/>
            <property name="javax.persistence.jdbc.password" value="secret"/>
            <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver"/>
            <property name="javax.persistence.jdbc.user" value="myUser"/>
        </properties>
    </persistence-unit>
</persistence>

Обратите внимание, что в заголовке есть некоторые объявления XML, которые могут быть важны, поскольку Hibernate сообщает вам, что ваш файл неверен.

14.10.2011
  • Спасибо за ответ Андре. К сожалению, я все еще сталкиваюсь с той же проблемой (менеджер сущностей возвращает Null). Как было предложено, я изменил уровень журнала на ВСЕ и переключился на MySQL (это то, что я все равно должен использовать для своего проекта). Это то, что я сейчас получаю при попытке запустить тест JUnit: : Недопустимый файл persistence.xml. Ошибка синтаксического анализа XML (строка-1: столбец-1): cvc-elt.1: Не удается найти объявление элемента «постоянство».code Большое спасибо за ваше время. С уважением, 16.10.2011
  • Проверьте мой ответ еще раз, я обновил ТРЕТИЙ элемент, предоставив вам пример моего рабочего файла persistence.xml. 18.10.2011
  • Лучше поздно, чем никогда :D Виновником действительно был файл persistence.xml. В итоге последовал совету Андре (некоторое время назад). Только что вернулся, чтобы сказать СПАСИБО. 07.09.2012
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..