45

我有用户实体并试图通过 id 从 base 获取它。实体定义如下。

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

3 回答 3

68

使用get而不是load

// ...
        try {
            session = HibernateUtil.getSessionFactory().openSession();
            user =  (User) session.get(User.class, user_id);
        } catch (Exception e) {
 // ...
于 2012-06-19T14:18:07.677 回答
4

getUserById您不应该创建未使用的新对象(user1)。只需将其分配给已经(但为空)的 initialized 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;
}
于 2012-06-18T19:28:37.260 回答
0

使用 EntityManager em;

public User getUserById(Long id) {
     return em.getReference(User.class, id);
}
于 2017-10-12T11:13:06.180 回答