Hibernate Test - 线程“main”java.lang.NullPointerException中的异常

时间:2015-06-23 12:37:05

标签: java hibernate

我有这个错误..有人能帮帮我吗?

  

run:线程“main”中的异常java.lang.NullPointerException at   cidade.CidadeJpaController.getEntityManager(CidadeJpaController.java:24)     在cidade.CidadeJpaController.create(CidadeJpaController.java:30)at   Main.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()); 
        }
    } 
}

2 个答案:

答案 0 :(得分:0)

在实例化控制器时,您似乎没有设置entityManagerFactory。因此它抛出一个空指针异常。根据您的代码

 em = getEntityManager();

getEntityManagerMethod():

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

这里emf已经为空。当您使用默认构造函数初始化代码时,我看不到任何注入。

此致 人士Himanshu

答案 1 :(得分:0)

你在CidadeJpaController中有这个构造函数,它接受EntityManagerFactory对象。

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

在实例化时,您没有提供EntityManagerFactory对象,导致尝试访问时出现空指针错误。 SO创建一个EntityManagerFactory对象并发送它CidadeJpaController.Below是一个示例解决方案在Main类中更改它

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();