2015-07-09 4 views
0

Я пытаюсь начать работу с ORM с помощью Hibernate в приложении Java SE. Я читал, что современный способ заключается в использовании JPA, а затем Hibernate в качестве поставщика непрерывности. Тем не менее, мой EntityManager равно нулю:ORM с JPA и Hibernate: EntityManager имеет значение null

зависимости:

<dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-core</artifactId> 
     <version>4.3.10.Final</version> 
    </dependency> 

    <dependency> 
     <groupId>org.hibernate</groupId> 
     <artifactId>hibernate-entitymanager</artifactId> 
     <version>4.3.10.Final</version> 
    </dependency> 

Сущность:

annotated with annotations form javax.persistence 

Для работы с базой данных:

public class PersistenceManager { 

    private static EntityManagerFactory emFactory; 

    private PersistenceManager() { 
     emFactory = Persistence.createEntityManagerFactory("pers-unit"); // defined in a persistence.xml 
    } 

    public static EntityManager getEntityManager() { 
     return emFactory.createEntityManager(); 
    } 

    public static void close() { 
     emFactory.close(); 
    } 
} 

, а затем:

String sql = "SELECT m FROM table m WHERE m.id = :id"; 
    EntityManager em = PersistenceManager.getEntityManager(); 
    em.getTransaction().begin(); 
    Query q = em.createQuery(sql); 
    q.setParameter("id", key); 
    Content result = (Content) q.getSingleResult(); 
    em.getTransaction().commit(); 
    em.close(); 
    PersistenceManager.close(); 
    return result; 

persistence.xml:

<persistence 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" 

    version="2.1"> 

    <persistence-unit name="pers-unit" 
     transaction-type="RESOURCE_LOCAL"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 

     <properties> 

      <property name="javax.persistence.jdbc.url" value="jdbc:mysql://localhost/dbdb" /> 
      <property name="javax.persistence.jdbc.user" value="root" /> 
      <property name="javax.persistence.jdbc.password" value="" /> 
      <property name="javax.persistence.jdbc.driver" value="com.mysql.jdbc.Driver" /> 

      <property name="hibernate.show_sql" value="true" /> 
      <property name="hibernate.format_sql" value="true" /> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.MySQLDialect" /> 
      <property name="hibernate.hbm2ddl.auto" value="validate" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

Это способ получил сейчас? Большинство обучающих программ, которые я вижу, используют SessionFactory и транзакцию из спящего режима.

Я посмотрел на книгу с 2014 года, и он использует это:

Configuration configuration = new Configuration(); 
configuration.configure(); 
ServiceRegistryBuilder srBuilder = new ServiceRegistryBuilder(); 
srBuilder.applySettings(configuration.getProperties()); 
ServiceRegistry serviceRegistry = srBuilder.buildServiceRegistry(); 
factory = configuration.buildSessionFactory(serviceRegistry); 

который уже имеет некоторый устаревший код.

Каков способ сделать это?

ответ

2

Я думаю, что у вас есть некоторая ошибка в вашем классе PersistenceManager. Элемент EntityManagerFactory является статическим, так же как и метод для получения EntityManager, но при вызове метода статическим способом у вас нет экземпляра PersistenceManager. Это означает, что конструктор вообще не вызывается и, следовательно, вы не сможете вызвать createEntityManager() в нулевой ссылке.

Вы можете попробовать это:

public class PersistenceManager { 

    private static EntityManagerFactory emFactory; 

    static { 
     emFactory = Persistence.createEntityManagerFactory("pers-unit"); // defined in a persistence.xml 
    } 

    public static EntityManager getEntityManager() { 
     return emFactory.createEntityManager(); 
    } 

    public static void close() { 
     emFactory.close(); 
    } 
} 

Что касается Вашего вопроса, если это путь ... Существует не окончательный ответ, поскольку это зависит от личного выбора. Учебники, которые используют SessionFactory и т. П., Относятся к Hibernate, тогда как те, которые называют EntityManagerFactory и EntityManager, относятся к спецификации JPA (который Hibernate реализует, но у нее также есть API, не поддерживающий JPA).

+0

Yepp, все было. Не думал о последствиях статического доступа. благодаря – user3629892

Смежные вопросы