Hibernate:通过id获取实体

时间:2012-06-18 19:21:49

标签: java hibernate

我有用户实体并试图通过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;
}

}

因此方法getUserById(Long user_id)不从数据库获取信息,它只是调用用户构造函数。为什么会这样?

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

3 个答案:

答案 0 :(得分:55)

使用get代替load

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

答案 1 :(得分:4)

getUserById中,您不应创建未使用的新对象(user1)。只需将其分配给已初始化的user(但为空)。否则Hibernate.initialize(user);实际上是Hibernate.initialize(null);

这是新的getUserById(我没有测试过这个;)):

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

答案 2 :(得分:0)

使用EntityManager em;

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