2015-06-23 70 views
0

我有這個錯誤..有人可以幫助我嗎?Hibernate測試 - 線程「main」中的異常java.lang.NullPointerException

運行:異常在線程 「主」 顯示java.lang.NullPointerException在 cidade.CidadeJpaController.getEntityManager(CidadeJpaController.java:24) 在cidade.CidadeJpaController.create(CidadeJpaController.java:30)在 主.Main.main(Main.java:10)的Java結果:1

CIDADE

package cidade; 
import java.io.Serializable; 
import javax.persistence.*; 

@Entity 
public class Cidade implements Serializable { 

    @Id 
    @GeneratedValue(strategy = GenerationType.SEQUENCE) 
    private long id; 
    private String nome; 
    private String uf; 

    public Cidade() { 
    } 

    public Cidade(String n, String u){ 
     this.nome = n; 
     this.uf = u; 
    } 

    public long getId() { 
     return id; 
    } 

    public void setId(long id) { 
     this.id = id; 
    } 

    public String getNome() { 
     return nome; 
    } 

    public void setNome(String nome) { 
     this.nome = nome; 
    } 

    public String getUf() { 
     return uf; 
    } 

    public void setUf(String uf) { 
     this.uf = uf; 
    } 
} 

的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="easyjavajpa" transaction-type="RESOURCE_LOCAL"> 
    <provider>org.hibernate.ejb.HibernatePersistence</provider> 
    <class>cidade.Cidade</class> 
    <validation-mode>NONE</validation-mode> 
    <properties> 
     <property name="javax.persistence.jdbc.url" value="jdbc:postgresql://localhost:5432/thibernate"/> 
     <property name="javax.persistence.jdbc.password" value="1234"/> 
     <property name="javax.persistence.jdbc.driver" value="org.postgresql.Driver"/> 
     <property name="javax.persistence.jdbc.user" value="postgres"/> 
     <property name="hibernate.cache.provider_class" value="org.hibernate.cache.NoCacheProvider"/> 
     <property name="javax.persistence.schema-generation.database.action" value="create"/> 
    </properties> 
    </persistence-unit> 
</persistence> 

CidadeJpaController

package cidade; 

import cidade.exceptions.NonexistentEntityException; 
import java.io.Serializable; 
import java.util.List; 
import javax.persistence.EntityManager; 
import javax.persistence.EntityManagerFactory; 
import javax.persistence.Query; 
import javax.persistence.EntityNotFoundException; 
import javax.persistence.criteria.CriteriaQuery; 
import javax.persistence.criteria.Root; 

public class CidadeJpaController implements Serializable { 

    public CidadeJpaController(EntityManagerFactory emf) { 
     this.emf = emf; 
    } 
    private EntityManagerFactory emf = null; 

    public CidadeJpaController() { 
    } 

    public EntityManager getEntityManager() { 
     return emf.createEntityManager(); 
    } 

    public void create(Cidade cidade) { 
     EntityManager em = null; 
     try { 
      em = getEntityManager(); 
      em.getTransaction().begin(); 
      em.persist(cidade); 
      em.getTransaction().commit(); 
     } finally { 
      if (em != null) { 
       em.close(); 
      } 
     } 
    } 

    public void edit(Cidade cidade) throws NonexistentEntityException, Exception { 
     EntityManager em = null; 
     try { 
      em = getEntityManager(); 
      em.getTransaction().begin(); 
      cidade = em.merge(cidade); 
      em.getTransaction().commit(); 
     } catch (Exception ex) { 
      String msg = ex.getLocalizedMessage(); 
      if (msg == null || msg.length() == 0) { 
       long id = cidade.getId(); 
       if (findCidade(id) == null) { 
        throw new NonexistentEntityException("The cidade with id " + id + " no longer exists."); 
       } 
      } 
      throw ex; 
     } finally { 
      if (em != null) { 
       em.close(); 
      } 
     } 
    } 

    public void destroy(long id) throws NonexistentEntityException { 
     EntityManager em = null; 
     try { 
      em = getEntityManager(); 
      em.getTransaction().begin(); 
      Cidade cidade; 
      try { 
       cidade = em.getReference(Cidade.class, id); 
       cidade.getId(); 
      } catch (EntityNotFoundException enfe) { 
       throw new NonexistentEntityException("The cidade with id " + id + " no longer exists.", enfe); 
      } 
      em.remove(cidade); 
      em.getTransaction().commit(); 
     } finally { 
      if (em != null) { 
       em.close(); 
      } 
     } 
    } 

    public List<Cidade> findCidadeEntities() { 
     return findCidadeEntities(true, -1, -1); 
    } 

    public List<Cidade> findCidadeEntities(int maxResults, int firstResult) { 
     return findCidadeEntities(false, maxResults, firstResult); 
    } 

    private List<Cidade> findCidadeEntities(boolean all, int maxResults, int firstResult) { 
     EntityManager em = getEntityManager(); 
     try { 
      CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); 
      cq.select(cq.from(Cidade.class)); 
      Query q = em.createQuery(cq); 
      if (!all) { 
       q.setMaxResults(maxResults); 
       q.setFirstResult(firstResult); 
      } 
      return q.getResultList(); 
     } finally { 
      em.close(); 
     } 
    } 

    public Cidade findCidade(long id) { 
     EntityManager em = getEntityManager(); 
     try { 
      return em.find(Cidade.class, id); 
     } finally { 
      em.close(); 
     } 
    } 

    public int getCidadeCount() { 
     EntityManager em = getEntityManager(); 
     try { 
      CriteriaQuery cq = em.getCriteriaBuilder().createQuery(); 
      Root<Cidade> rt = cq.from(Cidade.class); 
      cq.select(em.getCriteriaBuilder().count(rt)); 
      Query q = em.createQuery(cq); 
      return ((Long) q.getSingleResult()).intValue(); 
     } finally { 
      em.close(); 
     } 
    } 

} 

主要

package Main; 

    import java.util.*; 
    import cidade.*; 

    public class Main { 
     public static void main(String[] args) { 
      CidadeJpaController em = new CidadeJpaController(); 
      Cidade cidade = new Cidade("Santarém", "PA"); 
      em.create(cidade); 
      List cidades = em.findCidadeEntities(); 
      System.out.println(cidades.size() + " cidade(s) encontradas"); 
      for (Object c : cidades) { 
      Cidade cid = (Cidade) c; 
      System.out.println(cid.getNome()); 
     } 
    } 
} 

回答

0

看來,你是不是設置的entityManagerFactory在實例控制器。因此它拋出一個空指針異常。根據你的代碼

em = getEntityManager(); 

的getEntityManagerMethod():

public EntityManager getEntityManager() { 
     return emf.createEntityManager(); 
    } 

這裏EMF已經是空。當你使用默認的構造函數來初始化你的代碼時,我沒有看到任何注入。

問候 人士Himanshu

+0

然後使用構造,因爲我會在主? public CidadeJpaController(EntityManagerFactory emf){this.mf = emf; } – Jroliveira

+0

請參考一些像hibernate入門指南一樣的指南。在那裏他們解釋瞭如何聲明和注入你的EntityManagerFactory。這是休眠的開始。其中一個很好的讀法,你可以找到[這裏](https://docs.jboss.org/hibernate/entitymanager/3.6/reference/en/html_single/#d0e996) –

+0

我把...公共CidadeJpaController(){ 電動勢= Persistence.createEntityManagerFactory(「easyjavajpa」); } – Jroliveira

0

你有這樣的構造中CidadeJpaController這需要EntityManagerFactory的對象。

public CidadeJpaController(EntityManagerFactory emf) { 
     this.emf = emf; 
    } 
    private EntityManagerFactory emf = null; 

在實例你不提供,導致空指針錯誤試圖訪問時EntityManagerFactory的對象。因此,創建一個EntityManagerFactory的對象ANS發送CidadeJpaController.Below的樣品溶液改變它在主類

public static void main(String[] args) { 
      EntityManagerFactory entityManagerFactory = Persistence.createEntityManagerFactory("easyjavajpa"); 
      CidadeJpaController em = new CidadeJpaController(entityManagerFactory); 
      Cidade cidade = new Cidade("Santarém", "PA"); 
      em.create(cidade); 
     List cidades = em.findCidadeEntities(); 
相關問題