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