J'ai une entité utilisateur et j'essaie de l'obtenir de base en identifiant. La définition de l'entité est ci-dessous.
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;
}
}
Donc, la méthode getUserById (Long user_id) ne récupère pas les informations de la base de données, elle appelle simplement le constructeur de l'utilisateur. Pourquoi est-ce?
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;
}
utilisez get
au lieu de load
// ...
try {
session = HibernateUtil.getSessionFactory().openSession();
user = (User) session.get(User.class, user_id);
} catch (Exception e) {
// ...
Dans getUserById
, vous ne devriez pas créer un nouvel objet (utilisateur1) qui n'est pas utilisé. Attribuez-le simplement à la variable user
déjà (mais nulle) initialisée. Sinon, Hibernate.initialize(user);
est en fait Hibernate.initialize(null);
Voici la nouvelle getUserById
(je n'ai pas testé ceci;)):
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;
}
Utiliser EntityManager em;
public User getUserById(Long id) {
return em.getReference(User.class, id);
}