hibernate对象的三种状态、一级缓存、加载策略

一、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;	
}

立即加载相较于懒加载而言,要更加耗性能,使用立即加载还是懒加载在项目开发中以实际需求进行自由取舍!

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值