hibernate管理对象的三种状态、一级缓存、懒加载以及立即加载

一、hibernate管理对象的三种状态:
在这里插入图片描述
1、临时状态 例如:User user = new User; new 为临时状态

2、持久状态 例如:User user =get(user ); get为持久状态

3、游离状态 例如:session.close(); 关闭后为游离状态

1、hibernate是通过管理对象来操作数据,这里对象指的是持久化对象。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;	
}

猜你喜欢

转载自blog.csdn.net/KidShmily/article/details/84442956