2012-06-18 10 views
29

Tengo entidad de usuario y trato de obtenerla desde la base por id. La definición de la entidad está abajo.Hibernate: obtener entidad por id

package com.hibernate.logic; 

import java.io.Serializable; 
import java.util.Random; 

import javax.persistence.*; 

@Entity 
@Table(name="users") 
public class User implements Serializable { 
    private static final long serialVersionUID = 1L; 

@Id 
@Column(name="user_id") 
private Long userId; 

@Column(name="middlename") 
private String middlename; 

@Column(name="name") 
private String name; 

@Column(name="surname") 
private String surname; 

@Column(name="pass") 
private String pass; 

//bi-directional many-to-one association to Role 
@ManyToOne 
@JoinColumn(name="role_id") 
private Role role; 

public User() { 
    Random random = new Random(); 
    this.userId = random.nextLong(); 
    this.name = ""; 
    this.surname = ""; 
    this.middlename = ""; 
} 

public Long getUserId() { 
    return this.userId; 
} 

public void setUserId(Long userId) { 
    this.userId = userId; 
} 

public String getMiddlename() { 
    return this.middlename; 
} 

public void setMiddlename(String middlename) { 
    this.middlename = middlename; 
} 

public String getName() { 
    return this.name; 
} 

public void setName(String name) { 
    this.name = name; 
} 

public String getSurname() { 
    return this.surname; 
} 

public void setSurname(String surname) { 
    this.surname = surname; 
} 

public Role getRole() { 
    return this.role; 
} 

public void setRole(Role role) { 
    this.role = role; 
} 

public String getPass() { 
    return pass; 
} 

public void setPass(String pass) { 
    this.pass = pass; 
} 

} 

Así el método getUserById (Long user_id) no recibe la información de la base de datos, es simplemente llamada al constructor de usuario. ¿Por que es esto entonces?

public User getUserById(Long user_id) { 
     Session session = null; 
     User user = null; 
     try { 
      session = HibernateUtil.getSessionFactory().openSession(); 
      user = session.load(User.class, 
        user_id); 
      Hibernate.initialize(user); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } finally { 
      if (session != null && session.isOpen()) { 
       session.close(); 
      } 
     } 
     return user; 
    } 
+0

¿Por qué no devuelve user1, return (User) user1; – Subin

Respuesta

44

uso get en lugar de load

// ... 
     try { 
      session = HibernateUtil.getSessionFactory().openSession(); 
      user = (User) session.get(User.class, user_id); 
     } catch (Exception e) { 
// ... 
+0

muchas gracias, funciona. ¿Pero puedes describir la diferencia entre ellos? ¿Por qué se llamó a cinstructor? – Anatoly

+1

Aquí está subscrita en detalles http://stackoverflow.com/a/608979/1143825 – Ilya

+0

Hola, Ilya, en get (clase, parámetro), ¿puede el parámetro ser cualquier columna, o solo es para la clave principal? –

4

En getUserById No debe crear un nuevo objeto (usuario1) que no se utiliza. Simplemente asigne el inicializado user ya (pero nulo). De lo contrario Hibernate.initialize(user); es en realidad Hibernate.initialize(null);

Aquí está la nueva getUserById (no he probado esto;)):

public User getUserById(Long user_id) { 
    Session session = null; 
    Object user = null; 
    try { 
     session = HibernateUtil.getSessionFactory().openSession(); 
     user = (User)session.load(User.class, user_id); 
     Hibernate.initialize(user); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } finally { 
     if (session != null && session.isOpen()) { 
      session.close(); 
     } 
    } 
    return user; 
} 
+0

Lo siento, en realidad tienes razón, me confundieron con user1. Pero no resuelve el problema. Todavía es llamar al constructor cuando intento obtener un usuario de la base de datos. – Anatoly

0

Usando EntityManager em;

public User getUserById(Long id) { 
    return em.getReference(User.class, id); 
} 
Cuestiones relacionadas