web-dev-qa-db-fra.com

Hibernate: obtenir l'entité par identifiant

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;
    }
35
Anatoly

utilisez get au lieu de load 

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

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;
}
4
Michael Kohler

Utiliser EntityManager em;

public User getUserById(Long id) {
     return em.getReference(User.class, id);
}
0
Igor Vuković