[java] Hibernate: get entity by id

I have user entity and trying to get it from base by id. The entity definition is below.

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

}

So the method getUserById(Long user_id) doesn't get the information from database, it's just call user constructor. Why is it so?

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

This question is related to java hibernate

The answer is


In getUserById you shouldn't create a new object (user1) which isn't used. Just assign it to the already (but null) initialized user. Otherwise Hibernate.initialize(user); is actually Hibernate.initialize(null);

Here's the new getUserById (I haven't tested this ;)):

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

Using EntityManager em;

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