Foros del Web » Programación para mayores de 30 ;) » Java »

EntityManager nulo JPA

Estas en el tema de EntityManager nulo JPA en el foro de Java en Foros del Web. hola a todos, tengo un problema, estoy usando jpa, al crear las entidades todo esta bien pero al momento de trabajar con los Dao o ...
  #1 (permalink)  
Antiguo 27/10/2014, 09:33
Avatar de jocryo  
Fecha de Ingreso: agosto-2014
Mensajes: 38
Antigüedad: 10 años, 2 meses
Puntos: 0
Información EntityManager nulo JPA

hola a todos, tengo un problema, estoy usando jpa, al crear las entidades todo esta bien pero al momento de trabajar con los Dao o los sesionbean se me genera un problema, se crean normal pero al ejecutar se genera el inconveniente de que el EntityManager queda nulo y eso me genera un NullPointerException al momento de crear un registro, el codigo que tengo es este:

por sierto, tengo un bean que accede al UsuarioFacade

Entidad:
Código Java:
Ver original
  1. package co.com.glokal.almaviva.modelo.entity;
  2.  
  3. import java.io.Serializable;
  4. import javax.persistence.Basic;
  5. import javax.persistence.Column;
  6. import javax.persistence.Entity;
  7. import javax.persistence.GeneratedValue;
  8. import javax.persistence.GenerationType;
  9. import javax.persistence.Id;
  10. import javax.persistence.NamedQueries;
  11. import javax.persistence.NamedQuery;
  12. import javax.persistence.Table;
  13. import javax.persistence.UniqueConstraint;
  14. import javax.validation.constraints.NotNull;
  15. import javax.validation.constraints.Size;
  16. import javax.xml.bind.annotation.XmlRootElement;
  17.  
  18. /**
  19.  *
  20.  * @author jose.ceballos
  21.  */
  22. @Table(name = "usuario", uniqueConstraints = {
  23.     @UniqueConstraint(columnNames = {"usuario"})})
  24. @XmlRootElement
  25. @NamedQueries({
  26.     @NamedQuery(name = "Usuario.findAll", query = "SELECT u FROM Usuario u"),
  27.     @NamedQuery(name = "Usuario.findByUsuario", query = "SELECT u FROM Usuario u WHERE u.usuario = :usuario"),
  28.     @NamedQuery(name = "Usuario.findByPassword", query = "SELECT u FROM Usuario u WHERE u.password = :password"),
  29.     @NamedQuery(name = "Usuario.findByNombre", query = "SELECT u FROM Usuario u WHERE u.nombre = :nombre"),
  30.     @NamedQuery(name = "Usuario.findById", query = "SELECT u FROM Usuario u WHERE u.id = :id")})
  31. public class Usuario implements Serializable {
  32.     private static final long serialVersionUID = 1L;
  33.     @Basic(optional = false)
  34.     @NotNull
  35.     @Size(min = 1, max = 50)
  36.     @Column(name = "usuario", nullable = false, length = 50)
  37.     private String usuario;
  38.     @Basic(optional = false)
  39.     @NotNull
  40.     @Size(min = 1, max = 50)
  41.     @Column(name = "password", nullable = false, length = 50)
  42.     private String password;
  43.     @Basic(optional = false)
  44.     @NotNull
  45.     @Size(min = 1, max = 50)
  46.     @Column(name = "nombre", nullable = false, length = 50)
  47.     private String nombre;
  48.     @Id
  49.     @GeneratedValue(strategy = GenerationType.IDENTITY)
  50.     @Basic(optional = false)
  51.     @Column(name = "id", nullable = false)
  52.     private Integer id;
  53.  
  54.     public Usuario() {
  55.     }
  56.  
  57.     public Usuario(Integer id) {
  58.         this.id = id;
  59.     }
  60.  
  61.     public Usuario(Integer id, String usuario, String password, String nombre) {
  62.         this.id = id;
  63.         this.usuario = usuario;
  64.         this.password = password;
  65.         this.nombre = nombre;
  66.     }
  67.  
  68.     public String getUsuario() {
  69.         return usuario;
  70.     }
  71.  
  72.     public void setUsuario(String usuario) {
  73.         this.usuario = usuario;
  74.     }
  75.  
  76.     public String getPassword() {
  77.         return password;
  78.     }
  79.  
  80.     public void setPassword(String password) {
  81.         this.password = password;
  82.     }
  83.  
  84.     public String getNombre() {
  85.         return nombre;
  86.     }
  87.  
  88.     public void setNombre(String nombre) {
  89.         this.nombre = nombre;
  90.     }
  91.  
  92.     public Integer getId() {
  93.         return id;
  94.     }
  95.  
  96.     public void setId(Integer id) {
  97.         this.id = id;
  98.     }
  99.  
  100.     @Override
  101.     public int hashCode() {
  102.         int hash = 0;
  103.         hash += (id != null ? id.hashCode() : 0);
  104.         return hash;
  105.     }
  106.  
  107.     @Override
  108.     public boolean equals(Object object) {
  109.         // TODO: Warning - this method won't work in the case the id fields are not set
  110.         if (!(object instanceof Usuario)) {
  111.             return false;
  112.         }
  113.         Usuario other = (Usuario) object;
  114.         if ((this.id == null && other.id != null) || (this.id != null && !this.id.equals(other.id))) {
  115.             return false;
  116.         }
  117.         return true;
  118.     }
  119.  
  120.     @Override
  121.     public String toString() {
  122.         return "co.com.glokal.almaviva.controlador.entity.Usuario[ id=" + id + " ]";
  123.     }
  124.    
  125. }

UsuarioFacade:
Código Javascript:
Ver original
  1. package co.com.glokal.almaviva.modelo.daobeans;
  2.  
  3. import co.com.glokal.almaviva.modelo.entity.Usuario;
  4. import javax.ejb.Stateless;
  5. import javax.persistence.EntityManager;
  6. import javax.persistence.PersistenceContext;
  7.  
  8. /**
  9.  *
  10.  * @author jose.ceballos
  11.  */
  12. @Stateless
  13. public class UsuarioFacade extends AbstractFacade<Usuario> implements UsuarioFacadeLocal {
  14.     @PersistenceContext(unitName = "almaviva-ejbPU")
  15.     private EntityManager em;
  16.  
  17.     @Override
  18.     protected EntityManager getEntityManager() {
  19.         return em;
  20.     }
  21.  
  22.     public UsuarioFacade() {
  23.         super(Usuario.class);
  24.     }
  25.    
  26. }

bean:
Código Java:
Ver original
  1. package co.com.glokal.almaviva.controlador.beanejb;
  2.  
  3. import co.com.glokal.almaviva.modelo.dao.UsuarioDao;
  4. import co.com.glokal.almaviva.modelo.daobeans.UsuarioFacade;
  5. import co.com.glokal.almaviva.modelo.daobeans.UsuarioFacadeLocal;
  6. import co.com.glokal.almaviva.modelo.entity.Usuario;
  7. import java.util.logging.Level;
  8. import java.util.logging.Logger;
  9. import javax.ejb.Stateless;
  10. import javax.ejb.LocalBean;
  11.  
  12. /**
  13.  *
  14.  * @author jose.ceballos
  15.  */
  16. @Stateless
  17. @LocalBean
  18. public class UsuarioEjb {
  19.  
  20.     // Add business logic below. (Right-click in editor and choose
  21.     // "Insert Code > Add Business Method")
  22.     public int insertar(String user, String pass, String name){
  23.         int resp = 0;
  24.         try {
  25.             Usuario usuario = new Usuario();
  26.             usuario.setNombre(name);
  27.             usuario.setPassword(pass);
  28.             usuario.setUsuario(user);
  29.             usuario.setId(Integer.MIN_VALUE);
  30.             System.out.print(usuario.getNombre() + '/' + usuario.getPassword() + '/' + usuario.getUsuario());
  31.             UsuarioFacade usuarioDao = new UsuarioFacade();
  32.             usuarioDao.create(usuario);            
  33.             resp = usuario.getId();
  34.         } catch (Exception ex) {
  35.             Logger.getLogger(UsuarioEjb.class.getName()).log(Level.SEVERE, null, ex);
  36.         }
  37.         return resp;
  38.     }
  39. }

abstractFacade:
Código Java:
Ver original
  1. package co.com.glokal.almaviva.modelo.daobeans;
  2.  
  3. import java.util.List;
  4. import javax.persistence.EntityManager;
  5.  
  6. /**
  7.  *
  8.  * @author jose.ceballos
  9.  */
  10. public abstract class AbstractFacade<T> {
  11.     private Class<T> entityClass;
  12.  
  13.     public AbstractFacade(Class<T> entityClass) {
  14.         this.entityClass = entityClass;
  15.     }
  16.  
  17.     protected abstract EntityManager getEntityManager();
  18.  
  19.     public void create(T entity) {
  20.         getEntityManager().persist(entity);
  21.     }
  22.  
  23.     public void edit(T entity) {
  24.         getEntityManager().merge(entity);
  25.     }
  26.  
  27.     public void remove(T entity) {
  28.         getEntityManager().remove(getEntityManager().merge(entity));
  29.     }
  30.  
  31.     public T find(Object id) {
  32.         return getEntityManager().find(entityClass, id);
  33.     }
  34.  
  35.     public List<T> findAll() {
  36.         javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
  37.         cq.select(cq.from(entityClass));
  38.         return getEntityManager().createQuery(cq).getResultList();
  39.     }
  40.  
  41.     public List<T> findRange(int[] range) {
  42.         javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
  43.         cq.select(cq.from(entityClass));
  44.         javax.persistence.Query q = getEntityManager().createQuery(cq);
  45.         q.setMaxResults(range[1] - range[0] + 1);
  46.         q.setFirstResult(range[0]);
  47.         return q.getResultList();
  48.     }
  49.  
  50.     public int count() {
  51.         javax.persistence.criteria.CriteriaQuery cq = getEntityManager().getCriteriaBuilder().createQuery();
  52.         javax.persistence.criteria.Root<T> rt = cq.from(entityClass);
  53.         cq.select(getEntityManager().getCriteriaBuilder().count(rt));
  54.         javax.persistence.Query q = getEntityManager().createQuery(cq);
  55.         return ((Long) q.getSingleResult()).intValue();
  56.     }
  57.    
  58. }

persistence.xml
Código XML:
Ver original
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <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">
  3.   <persistence-unit name="almaviva-ejbPU" transaction-type="JTA">
  4.     <jta-data-source>basepruebas</jta-data-source>
  5.     <exclude-unlisted-classes>false</exclude-unlisted-classes>
  6.     <properties/>
  7.   </persistence-unit>
  8. </persistence>

no se que pueda ser lo que este mal, sinceramente no tengo ni idea de como arreglar esto

gracias de antemano
  #2 (permalink)  
Antiguo 27/10/2014, 09:54
Avatar de jocryo  
Fecha de Ingreso: agosto-2014
Mensajes: 38
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: EntityManager nulo JPA

cambie el codigo de getEntityManager y lo deje asi:

Código Java:
Ver original
  1. protected EntityManager getEntityManager() {
  2.         EntityManagerFactory emf = Persistence.createEntityManagerFactory("almaviva-ejbPU");
  3.         /*EntityManager ecm = emf.createEntityManager(); */
  4.         em = emf.createEntityManager();
  5.         return em;
  6.     }

asi funciona pero ahora no se porque la funcion insertar que esta en el bean pero solo una vez y me bota el valor mas bajo de un entero (-2147483648) inclusive si forzo que me asigne a resp el valor de 1 me retorna -2147483648

en las siguientes ejecuciones fallaba otra vez la insercion

porque es esto?

Última edición por jocryo; 27/10/2014 a las 10:07
  #3 (permalink)  
Antiguo 28/10/2014, 13:42
Avatar de jocryo  
Fecha de Ingreso: agosto-2014
Mensajes: 38
Antigüedad: 10 años, 2 meses
Puntos: 0
Respuesta: EntityManager nulo JPA

bien, ya logre solucionarlo, el problema era la llave principal, ya que le estaba mandando un valor (porque asi lo vi en un ejemplo) y me generaba este error, pero ahora el inconveniente es que me sale un error en el eliminar (el editar no formo problemas) el error que me sale es:
Cita:
Grave: java.lang.IllegalArgumentException: Entity must be managed to call remove: co.com.glokal.almaviva.controlador.entity.Usuario[ id=3 ], try merging the detached and try the remove again.

¿alguna idea de como resolverlo?

Etiquetas: jpa, nulo, string
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 08:47.