一、hibernate管理对象的三种状态:
1、临时状态
2、持久状态
3、游离状态
1、hibernate是通过管理对象来操作数据,这里对象指的是持久化对象。
2、hibernate中的三种状态的对象是可以相互转换的,通常编码时只关注持久
化对象。关注get、save、update方法所操作后的对象
二、一级缓存、快照
一级缓存,又被称为session级别的缓存,session.get方法执行的时候,将查询出来的对象形成快照保存到内存中
当调用对象的set方法时、session.update(user) 就是将user实例对象与jvm中的快照进行对比,当不一致的时候,会自动更新数据库。
public static void main(String[] args) {
Configuration configure = new Configuration().configure("hibernate.cfg.xml");
SessionFactory sessionFactory = configure.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
// 将student形成的快照保存到内存中
Student studetn=session.get(Student.class, 1);
// 将student实例对象与jvm中的快照进行对比,当不一致的时候,会自动跟新数据库。
student.setSname("张三");
transaction.commit();
session.close();
}
三、加载策略
get与load方法的区别:
get时立即加载,获取的是具体的类对象
load是懒加载,获取到是hibernate根据实体类创建的代理对象,代理对象用来保存实体类对象的主键id,id是hibernate用来标识实体类的唯一性。
public static void main(String[] args) {
Configuration configure = new Configuration().configure("hibernate.cfg.xml");
SessionFactory sessionFactory = configure.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Student student=new Student();
student.setSid(1);
Student student=get(student);
System.out.println(student.getSid());
System.out.println(student.getSname());
Student student=load(student);
System.out.println(student.getSid());
/*
* 当第二次使用student时会报错
* org.hibernate.LazyInitializationException:
* could not initialize proxy [com.zking.hibernate.entity.Student#1] - no Session
*
* hibernate根据实体类创建的代理对象 Student$HibernateProxy$IXtQTGmT,当需要调用除id
* 外的其他属性时,hibernate才会访问数据库(懒加载),由于前面已经将load方法已经将session给
* 关闭了,所以再去后台查询的话,会报懒加载的异常
*
*
*/
System.out.println(student.getSname());
transaction.commit();
session.close();
}
/**
* session.get方法是立即加载
*/
public static Student get(Student student) {
Configuration configure = new Configuration().configure("hibernate.cfg.xml");
SessionFactory sessionFactory = configure.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Student student=session.get(Student.class, student.getSid);
transaction.commit();
session.close();
return student;
}
/**
* session.load方法是懒加载
*/
public static Student load(Student student) {
Configuration configure = new Configuration().configure("hibernate.cfg.xml");
SessionFactory sessionFactory = configure.buildSessionFactory();
Session session = sessionFactory.openSession();
Transaction transaction = session.beginTransaction();
Student student=session.load(Student.class, student.getSid);
transaction.commit();
session.close();
return student;
}
立即加载相较于懒加载而言,要更加耗性能,使用立即加载还是懒加载在项目开发中以实际需求进行自由取舍!