这是我的模型类
@Entity
public class Student {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private int id;
private String name;
private String company;
private Date date;
@Override
public String toString() {
return "Student [id=" + id + ", name=" + name + ", company=" + company + ", date=" + date + "]";
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCompany() {
return company;
}
public void setCompany(String company) {
this.company = company;
}
public Date getDate() {
return date;
}
public void setDate(Date date) {
this.date = date;
}
}
这是主要方法
public class StudentTest {
public static void main(String[] args) {
SessionFactory sessionfactory=new Configuration().configure().buildSessionFactory();
Session session=sessionfactory.openSession();
Student student=new Student();
student.setName("Rajat");
student.setDate(new Date());
student.setCompany("Yash");
session.persist(student);
student.setName("Prashant");
Student getStudent=(Student)session.load(Student.class, 1);
System.out.println("--------------load-------------");
System.out.println(getStudent);
// Student getStudent1=(Student)session.get(Student.class, 1);
// System.out.println("-----------get------------------");
// System.out.println(getStudent1);
Transaction t=session.beginTransaction();
session.getTransaction().commit();
session.close();
sessionfactory.close();
}
}
我正在尝试学习(保存和持久)和(获取和加载方法)之间的区别。 这里load方法给出异常,而get方法给出null。为什么?
答案 0 :(得分:0)
由于load
的javadoc强调:
返回给定实体类的持久化实例 给定标识符,假设实例存在。 ......仅用它 检索您认为存在的实例,其中不存在 这将是一个实际的错误。
get
方法不是这种情况,它自然允许不存在并且只返回空引用。
load
用于提高性能,因为在第一次使用实体(例如触发getter)之前,不会触发实际的数据库查询。唯一的缺点是你必须确保这个特定的条目实际存在于数据库中。
答案 1 :(得分:0)
这正是两种方法的预期行为,你可以在Hibernate Session documentation中看到它。
load()
会出现异常,因为如果找不到行,它会抛出ObjectNotFoundException
。get()
时,如果找不到行,您将获得null
。<强>文档强>
文件清楚地说:
load(Class theClass, Serializable id)
:返回具有给定标识符的给定实体类的持久化实例,假设该实例存在。
get(Class theClass, Serializable id)
:使用给定的标识符返回给定实体类的持久化实例,如果没有这样的持久化实例,则返回null。
<强>解释强>
您可以在this session.get() and session.load() Tutorial中看到:
session.load()
它将始终返回“代理”(Hibernate术语)
没有打到数据库。在Hibernate中,proxy是一个对象
给定的标识符值,其属性尚未初始化,
它看起来像一个临时假物体。如果没有找到行,它会
抛出ObjectNotFoundException
。session.get()
它总是命中数据库并返回真实对象,
表示数据库行的对象,而不是代理。如果没有排
发现,它返回null
。